是否可以在不修改基类的情况下从派生类中更改基类方法中使用的类型?

时间:2019-06-12 12:44:29

标签: c# inheritance substitution

假设我们有四个类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();
    }
}

我想要实现的是,当从类B内部调用基本方法base.method()时,实际上使用的是类型U,而不是类型T。这样,Main()方法的输出将是:

I am using U.

是否可以在C#中实现而无需修改类A和/或T ?诸如using指令之类的东西会很好。上面的代码-显然-不能按我的要求工作。我也考虑过使用反射,但是我不确定在这种情况下是否可以使用反射而不必实例化一个新的(匿名)对象或引用一个现有的对象(在我的情况下两者都不好)。

否则,我将不得不通过用U替换每个T或在开头插入using指令(或接受参数,或者修改参数)来修改A类(将B类几乎逐行复制)。使用模板等)。无论哪种方式,我都觉得这不是很整洁,我想知道它是否可以更好地实现。

我缺少明显的东西吗? 预先感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

简短的回答:不,在当前结构下,无法使从base.method()调用的B使用method的{​​{1}}而不是{{1} },而无需修改UT。但是,为什么不呢?

A

答案 1 :(得分:0)

我还没有尝试过,但是您确定将对象强制转换为您希望提供帮助的基类。

赞:

((U)this).method();

编辑:之所以使用类型T而不是类型U,是因为类A中有一个类型T的实例。