【发布时间】:2011-01-18 22:53:00
【问题描述】:
给定以下 C# 类定义和代码:
public class BaseClass
{
public virtual void MyMethod()
{
...do something...
}
}
public class A : BaseClass
{
public override void MyMethod()
{
...do something different...
}
}
public class B : BaseClass
{
public override void MyMethod()
{
...do something different...
}
}
public class AnotherObject
{
public AnotherObject(BaseClass someObject)
{
someObject.MyMethod(); //This calls the BaseClass method, unfortunately.
}
}
我想调用实际在 A 或 B 中找到的 MyMethod(),假设传入的对象实际上是 A 或 B 的实例,而不是在 BaseClass 中找到的那个。少做这样的事情:
public class AnotherObject
{
public AnotherObject(BaseClass someObject)
{
A temp1 = someObject as A;
if (A != null)
{
A.MyMethod();
}
B temp2 = someObject as B;
if (B != null)
{
B.MyMethod();
}
}
}
我该怎么做?
【问题讨论】:
-
您传递给 AnotherObject 构造函数的 ACTUAL 对象的类型是什么?换句话说,新的声明是什么?因为您所描述的只有在您新建 BaseClass 而不是 A 或 B 时才会发生。
-
糟糕。才意识到我的问题。我认为重写该函数的几个类之一实际上未能重写该函数。问题解决了。
-
我认为这是代码异味这一事实对 David 来说是显而易见的,否则问题就不会发布,而是会使用异味代码。
标签: c# inheritance methods virtual overriding