Mic*_*ren 3 c# polymorphism inheritance c#-2.0
我正在使用一个为我生成一堆类的库.
这些类都继承自公共基类,但该基类没有定义所有子类共有的几个方法.
例如:
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中做我想要的东西 - 我没有得到intellisense但是编译器很高兴并且它有效:
CType(Obj, Object).Add(Item) // Note: I'm using C#--NOT VB
Againt,我无法控制这些类(我认为排除了部分类).
如果不采用反射或其他脏技巧,则无法调用派生类的非虚方法.如果你想这样做,那么很容易:
// obj is your object reference.
obj.GetType().InvokeMember("MethodName", 
    System.Reflection.BindingFlags.InvokeMethod, null, obj, null /* args */)