我正试图刷新我的记忆但无法找到谷歌的答案.
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)
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)