所以我有一个 Account 类型的数组,它由从 Account 派生的 Savings 和 Checking 组成。是否有可能让这些调用他们的方法?编译器只使基类中的方法可见,我无法访问派生类中的方法。把我的头撞到这里的墙上。
问问题
1269 次
3 回答
4
您需要将数组中的元素转换为派生类:
((Checking)someArray[42]).Whatever();
如果实例实际上不是该类型,这将抛出一个InvalidCastException
.
于 2012-09-11T23:50:55.177 回答
2
尽管您可以使用强制转换,但由于您不知道数组元素的确切类型,这将导致一堆异常和一个相当丑陋的代码来处理它们。
你可以使用类似的东西:
Saving s = array[i] as Saving;
if(s != null)
{
s.SomeSavingMethod();
}
else
{
Checking c = array[i] as Checking;
if(c != null)
c.SomeCheckingMethod();
}
然而,猜测类型并相应地调用方法,通常被认为是一个糟糕的设计。这听起来像是虚拟方法的情况,或者这些东西首先不应该在同一个数组中。
于 2012-09-12T00:03:29.357 回答
0
基本上有两种方法可以用来完成您似乎正在寻找的功能。
第一个并且可以说是最好的(对于您描述的情况)是声明所有这些类都实现的公共接口。
public interface IWorker
{
void DoWork();
}
public class A : IWorker
{
public void DoWork()
{
// TODO: Implement this method
throw new NotImplementedException();
}
}
public class B : IWorker
{
public void DoWork()
{
// TODO: Implement this method
throw new NotImplementedException();
}
}
第二个是检测类型并在它支持的情况下调用该方法。沿着这些思路。这是AS 运算符非常方便的地方,因为如果转换成功,它只会返回非空值。
List<object> workers = new List<object>() { new A(), new B() };
foreach (object itm in workers)
{
ClassThatSupportsDoWork obj = itm as ClassThatSupportsDoWork;
if (obj != null)
obj.DoWork();
}
于 2012-09-12T00:05:45.610 回答