C# 我可以从父对象访问子对象变量吗?
假设我有一个叫做“动物”的类,它是由“猫”继承的。 如果我现在有一个动物数组,我可以从中访问cat变量吗(当然,如果动物也是猫的话)?您可以使用运算符 is运算符检查表达式的结果是否兼容 使用给定类型,或(从C#7.0开始)测试表达式 与模式相反C# 我可以从父对象访问子对象变量吗?,c#,class,variables,inheritance,polymorphism,C#,Class,Variables,Inheritance,Polymorphism,假设我有一个叫做“动物”的类,它是由“猫”继承的。 如果我现在有一个动物数组,我可以从中访问cat变量吗(当然,如果动物也是猫的话)?您可以使用运算符 is运算符检查表达式的结果是否兼容 使用给定类型,或(从C#7.0开始)测试表达式 与模式相反 注意:是C#7.0版的操作员支持您可以将动物投射到猫身上。有多种方法可以做到这一点((猫)MyAnimal).Purr()或(MyAnimal作为猫).Purr()或更好的如果(MyAnimal是猫)myCat.Purr()考虑当每只猫都是动物时,不是
注意:
是C#7.0版的操作员支持
您可以将动物投射到猫身上。有多种方法可以做到这一点((猫)MyAnimal).Purr()
或(MyAnimal作为猫).Purr()
或更好的如果(MyAnimal是猫)myCat.Purr()
考虑当每只猫
都是动物时,不是每只动物
都是猫
,因此转换可能失败。无论如何:有数百个类似的问题,只要搜索并尝试一下。或者你可以使用所有类都可用的Object.GetType()
。那么您就不必依赖新版本的C#
@RyanWilson模式匹配不是检查变量是否属于给定类型<代码>动物是猫
从C#1开始工作。这只是执行强制转换并返回结果的一种方便方式,就像执行强制转换并检查null一样。是的,正如希姆布罗姆比尔所说,动物是猫
不是模式匹配。C#7支持将动物转换为lovelyCat。如果您使用的是C#的较低版本,则需要将条件语句拆分为两行,例如,If(animal is Cat){var lovelyCat=(Cat)animal;。}
@HimBromBeereObject.GetType()
仍然有效,您需要在施放之前检查animal
是否是猫
。@RyanWilson当然,但是使用GetType
执行此操作不会覆盖所有情况,例如,如果某个对象继承了Cat
,则不会覆盖所有情况。当然,这超出了问题的范围,但我不想用动物是猫而不是动物。GetType()==typeof(Cat)
。
foreach(var animal in animals)
{
if(animal is Cat lovelyCat)
{
//You can use lovelyCat as object of Cat
}
}