将派生类转换为基类

Lev*_*kon 33 c# polymorphism

我正试图刷新我的记忆但无法找到谷歌的答案.

public class BaseClass
{
    public virtual void DoSomething()
    {
        Trace.Write("base class");
    }
}

public class DerivedClass : BaseClass
{
    public override void DoSomething()
    {
        Trace.Write("derived class");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我创建一个派生类的实例,我该如何将它转换为它的基类,这样当调用DoSomething()时,它只使用基类的方法?

动态转换仍然会调用派生类的重写方法:

DerivedClass dc = new DerivedClass();

dc.DoSomething();

(dc as BaseClass).DoSomething();
Run Code Online (Sandbox Code Playgroud)

输出:"派生类"

sha*_*zia 37

虽然这听起来不合理,但它确实有效

 DerivedClass B = new DerivedClass();

BaseClass bc = JsonConvert.DeserializeObject<BaseClass>(JsonConvert.SerializeObject(B));
Run Code Online (Sandbox Code Playgroud)

  • @Vaibhav 它只是忽略所有额外的属性:) (3认同)
  • 除了所有学术上的“反模式”论点,有时最简单的解决方案是正确的解决方案。该解决方案效果很好!考虑扩展实体模型,然后在从客户端退还基本实体后尝试保存它。这是个问题。您是要编写大量提取基本模型的代码,还是仅使用此代码? (3认同)
  • 深层复制是可接受的解决方案之一,但它会带来性能成本. (2认同)
  • 当序列化到基类中时,这会将派生类中可能存在的额外属性放在哪里?例如。StudentDerived类在继承StudentBase的同时引入了学生的Height。 (2认同)
  • 好的,但是这种反模式应该只在扩展异常或规避情况时使用——尽管没有道理。这种 OOP 违规肯定需要重新考虑设计。 (2认同)

Jon*_*eet 36

你不能 - 这完全是故意的,因为这就是多态性的全部意义所在.假设您有一个派生类,它对您传递给重写方法的参数强制执行某些先决条件,以保持完整性......您不希望能够绕过该验证并破坏其内部完整性.

在类本身内你可以非虚拟地调用base.AnyMethod()(无论这是你要覆盖的方法还是没有),但这没关系,因为这是类本身决定可能允许其完整性被违反 - 可能它知道它正在做什么.


Pap*_*ndy 11

你绝对可以(调用基本方法),只需阅读多态性:

http://msdn.microsoft.com/en-us/library/ms173152(v=VS.80).aspx

例:

public class BaseClass
{
    public void DoWork() { }
    public int WorkField;
    public int WorkProperty
    {
        get { return 0; }
    }
}

public class DerivedClass : BaseClass
{
    public new void DoWork() { }
    public new int WorkField;
    public new int WorkProperty
    {
        get { return 0; }
    }
}
Run Code Online (Sandbox Code Playgroud)

以及如何称呼它:

DerivedClass B = new DerivedClass();
B.DoWork();  // This calls the new method.

BaseClass A = (BaseClass)B;
A.DoWork();  // This calls the old method.
Run Code Online (Sandbox Code Playgroud)

  • 您的方法不是虚拟的,因此这种情况不是多态的,因此与原始问题不相似。 (3认同)