假设我有这个超类:
public class SuperClass { }
还有这些子类:
public class SubClass1 : SuperClass { }
public class SubClass2 : SuperClass { }
我们有这个客户端代码:
public void DoStuff(SuperClass arg)
{
if (arg is instance of SubClass1, but not an instance of SubClass2) // How to check this ?
{
var data = (SubClass1) arg;
// Do stuff
}
}
如何检查是否arg
是SubClass1
only 或SubClass2
only ?
一个类不能同时是
SubClass1
和SubClass2
。类层次结构中的兄弟不兼容赋值。因此,您只需要检查一次:请注意,我在这里使用了模式匹配。测试对象的类型,如果匹配,则将其分配给变量
data
。这会自动声明data
为SubClass1
。您还可以在 switch 语句中使用模式匹配:
如果需要返回一个值,那么 switch 表达式就更简单了。
if
或 的这种使用switch
通常表明更面向对象的方法可能会更好地解决问题。例如,让我们考虑上面的 switch 语句。我们可以在基类中声明一个抽象或虚拟方法,而不是在(子)类型上切换以决定是否必须执行DoStuff1
或。然后子类可以覆盖此方法并实现其类型特定的内容。然后,我们可以简单地调用。DoStuff2
DoStuff
arg.DoStuff();
然后
给定继承层次结构
BaseClass
-->SubClass
-->SubSubClass
,如果obj is SubClass
,则obj
可以是SubClass
或SubSubClass
。但请注意,这里有父子关系。但在大多数情况下这是可以的,因为
SubSubClass
赋值兼容SubClass
,并且可以执行其父类可以执行的所有操作。在 OOP 中,您不必担心对象的真实类型。例如:TextBox
,Label
和ComboBox
都(直接或间接)从派生Control
。如果您有Control c = Controls[0];
,您可以安全地编写c.BackColor = Color.Yellow;
。您可以使用模式匹配一次性完成检查和分配:
SubClass2
由于类别已经定义的方式,因此无需进行单独的检查。如果您想要单独检查“不是任何类型的子类”,那么您可以使用进行比较
GetType()
,如下所示:对于问题中的唯一部分,您需要执行以下操作:
arg.GetType()==typeof(SubClass1)
尝试一下
尽管问题已经得到解答(通过模式匹配或其他选项),但不同的方法可以得到更好(且可维护)的结果:
如果你的 SuperClass 声明了一个抽象方法
然后你的 SubClass1 和 SubClass2 可以做不同的事情
这将使子类担心它们必须做什么,而不是让不同的类完全拥有它们的逻辑。
你的客户端代码看起来也会简单得多