【发布时间】:2009-04-16 18:10:17
【问题描述】:
我正在使用一个为我生成一堆类的库。
这些类都继承自一个通用基类,但该基类没有定义所有子类通用的几个方法。
例如:
SubClassA : BaseClass{
void Add(ItemA item) {...}
ItemA CreateNewItem() {...}
}
SubClassB: BaseClass{
void Add(ItemB item) {...}
ItemB CreateNewItem() {...}
}
不幸的是,基类没有这些方法。这会很棒:
BaseClass{
// these aren't actually here, I'm just showing what's missing:
abstract void Add(ItemBaseClass item); // not present!
abstract ItemBaseClass CreateNewItem(); // not present!
}
由于我的 A+B 对象有一个公共基类,而 Item 对象有一个公共基类,我希望能从多态的奇妙世界中受益。
不幸的是,由于通用方法实际上并不存在于基类中,因此我无法虚拟调用它们。例如,这将是完美的:
BaseClass Obj;
Obj = GetWorkUnit(); // could be SubClassA or SubClassB
ItemBaseClass Item = Obj.CreateNewItem(); // Compile Fail: CreateNewItem() isn't in the base class
Item.DoSomething();
Obj.Add(Item); // Compile Fail: Add(...) isn't in the base class
显然铸造会起作用,但我需要知道我拥有哪种类型会抵消好处。
如何“强制”调用这些方法?我不担心得到一个不实现我试图调用的方法的对象。我实际上可以在 VB 中做我想做的事——我没有得到智能感知,但编译器很高兴并且它可以工作:
CType(Obj, Object).Add(Item) // Note: I'm using C#--NOT VB
再说一次,我无法控制这些类(我认为这排除了部分类)。
【问题讨论】:
-
那你自己的方法有什么问题呢?仅当您有 Option Strict On 时才使用我的
-
你对子类有控制权吗?如果这样做,请使用 Lucero 的解决方案。
-
@Michael Haren:C# 根本没有 Option Strict。如果您无法控制类,则我的解决方案有效,如果您可以控制子类,则 Lucero 的解决方案是最好的。
标签: c# inheritance c#-2.0 polymorphism