Можно ли изменить тип, используемый в методе базового класса, из производного класса без изменения базового класса? - PullRequest
0 голосов
/ 12 июня 2019

Предположим, у нас есть четыре класса A, B, T и U, которые выглядят примерно так:

using System;
using bla;


public class T
{
    public void method()
    {
        Console.WriteLine("I am using T.");
    }
}

public class U : T
{
    public new void method()
    {
        Console.WriteLine("I am using U.");
        // other stuff...
    }
}

public class A
{
    public T t;
    public void method()
    {
        t = new T();
        t.method();
        // some important manipulations of t...
    }
}

namespace bla{
    using T = U;
    public class B : A
    {
        public new void method()
        {
            // now use type U instead of T in the base method.
            base.method();
            // other stuff...
        }    
    }
}

public class Test
{
    public static void Main()
    {
        B b = new B();
        b.method();
    }
}

Я хочу добиться этого, когда базовый метод base.method() фактически вызывается из класса Bиспользуется тип U, а не тип T. Таким образом, результат метода Main() будет:

I am using U.

Возможно ли добиться этого в C # без необходимости изменения класса A и /или Т ?Что-то вроде директивы using было бы неплохо.Код выше - очевидно, - не работает так, как я хочуЯ также думал об использовании отражения, но я не уверен, возможно ли использовать отражение в этом случае без необходимости создания экземпляра нового (анонимного) объекта или ссылки на существующий (оба не были бы хороши в моем случае).

В противном случае мне пришлось бы изменить класс A (или, соответственно, класс B как почти 100% построчное копирование), либо заменив каждый T на U, либо вставив в начале директиву using (или приняв параметры,или используя шаблоны, или что-нибудь).В любом случае я бы нашел это не очень аккуратным, и мне интересно, можно ли это как-то улучшить.

Я что-то упускаю из виду?Заранее спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Краткий ответ: нет, учитывая текущую структуру, невозможно сделать base.method(), который вызывается из B, чтобы использовать method из U вместо T без изменения ни A, ни T.Однако, почему вы не просто:

public class B : A
{
    public new void method()
    {
        U u = new U();
        u.method();
    }    
}
0 голосов
/ 12 июня 2019

Я еще не пробовал, но вы, я уверен, приведение объекта в базовый класс, который вы хотите, может помочь.

Примерно так:

((U)this).method();

РЕДАКТИРОВАТЬ: Причина типа T используется вместо типа U в том, что там есть экземпляр типа T в классе A.

...