【问题标题】:Type-Cast member of derived classes派生类的类型转换成员
【发布时间】:2015-01-04 16:24:49
【问题描述】:

我有一个类 M 和许多派生类 A:M、B:M、C:M

派生类A、B、C明显不同,否则没有被声明。

M 实现了一个需要知道调用类的类型的成员。

所以,今天我在 M 中使用了一个抽象成员,并在每个派生类中单独覆盖。

中号:

public abstract Do() {};

在 A 中:

public override void Do()
{
    DoMore<A>();
}

在 B 中:

public override void Do()
{
    DoMore<B>();
}

在 C 中:

public override void Do()
{
    DoMore<C>();
}

有没有办法在M 中为所有派生类实现一次Do()?比如:

中号:

public Do<T>() {
    DoMore<T>();
}

这不起作用,因为 DoMore() 正在对派生类进行强制转换。

【问题讨论】:

  • 如果DoMore 需要为每个派生类做一些特定的事情,为什么它不也是抽象/虚拟的?
  • 一个“更大”的类型不应该知道它的任何派生一次。您确定基类是您真正需要的吗?您需要派生类型的特定成员吗?
  • 你能像void DoMore(Type t)这样改变DoMore的方法吗?

标签: c# inheritance casting


【解决方案1】:

如果你让基类泛型,你可以让它“意识到”它的派生类型:

public class M<T> 
{
    public Do<T>() 
    {
        DoMore<T>();
    }
}

public class A : M<A> {...}
public class B : M<B> {...}
public class C : M<C> {...}

【讨论】:

    【解决方案2】:

    这将是可能的,以防你创建

                 DoMore method in the base class and make it abstract and override 
                 in the child class so that appropriate method is called 
    

    但或多或少会是 与覆盖 Do 方法相同,您刚刚移动到父类并使其非抽象。

    【讨论】:

      猜你喜欢
      • 2021-01-15
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 2022-10-14
      • 1970-01-01
      • 2010-11-01
      • 2011-04-06
      相关资源
      最近更新 更多