区分基类的派生类的最佳方法是什么?

Jas*_*son 2 .net oop polymorphism inheritance

我有基类BaseClass和派生类DerivedA,DerivedBDerivedC所有的继承BaseClass.

我有另一个类,ExternalClass一个方法接受一个类型的参数BaseClass,但实际上传递了一个派生类.ExternalClass如果我想根据收到的派生类执行不同的操作,区分这些类的最佳方法是什么?

我在考虑做一件事,Select但我不确定如何做.

Meh*_*ari 18

你的设计很有可能存在缺陷.您应该考虑将该行为作为一种方法,BaseClass并在每个派生类中覆盖它.您不应该检查对象的实际类型.

也就是说,无论实际类型如何,ExternalClass都应该调用声明的方法BaseClass.由于该方法被派生类覆盖,因此将调用适当的实现.

也就是说,要检查对象是否是类型的实例或其派生类,您可以使用is运算符:

if (obj is DerivedA) // C#
If TypeOf obj Is DerivedA Then ' // VB
Run Code Online (Sandbox Code Playgroud)

如果要检查对象是否是特定类型的实例(而不是其派生类型):

if (obj.GetType() == typeof(DerivedA)) // C#
If obj.GetType() Is GetType(DerivedA) Then ' // VB
Run Code Online (Sandbox Code Playgroud)

  • +1坚实的建议.如果你发现自己在继承树中对类类型进行了切换,那么你可能做错了什么. (11认同)
  • 谢谢你让我知道我错了.这肯定是有帮助的. (3认同)
  • Jason:使用一个工厂方法,它使用预先填充的`Dictionary <IdType,Func <BaseClass >>`来查找每个派生类的实例化函数并调用它.这真是一个单独的事情.您没有打开对象的"类型".您正在切换传递的ID并"创建"该类.在当前的问题中,你有一个根据类型应该表现不同的对象,这是多态性的作用. (3认同)