Java 转换为子类
当我这样做时:Java 转换为子类,java,c#,Java,C#,当我这样做时: Animal dog = new Dog(); 如果狗是动物的一个子类,那么这个对象实际上是一个狗型的对象,它是否曾经暴露在这个系统中,或者它永远消失了?这个问题与Java和C有关,因为我假设它们是相似的,但为了清楚起见,让我们把重点放在C上 根据我的知识,我认为这个物体将永远被视为动物物体。Dog的属性和方法将被分配给对象实例,但我们永远不会知道它是从Dog类实例化的 在Java中,您可以使用instanceof检查dog是否为dog的实例: if (dog instance
Animal dog = new Dog();
如果狗是动物的一个子类,那么这个对象实际上是一个狗型的对象,它是否曾经暴露在这个系统中,或者它永远消失了?这个问题与Java和C有关,因为我假设它们是相似的,但为了清楚起见,让我们把重点放在C上
根据我的知识,我认为这个物体将永远被视为动物物体。Dog的属性和方法将被分配给对象实例,但我们永远不会知道它是从Dog类实例化的 在Java中,您可以使用instanceof检查dog是否为dog的实例:
if (dog instanceof Dog) ...
在C#中,您可以检查wheter dog is dog using is的实例:
if(dog is Dog) ...
或用作:
var dog = animal as Dog;
if( dog != null )
dog.Bark();
通过将
Animal
实例投射到Dog
Animal dog = new Dog();
// then somewhere
var dogDog = (Dog)dog;
如果您不确定它是否为狗,请使用“软”铸造
另一个问题——我们需要关心什么是具体类型的动物吗? 如果您关心-那么在这种情况下不应该使用继承
假设您有一个以
Animal
为参数的方法,这意味着您应该能够传递Animal
的任何派生类,并且您的方法将以预期的方式工作。如果您这样做dogDog=(Dog)Dog
您将获得Dog
的所有属性/方法,因此您可以访问这些属性/方法您的假设是错误的。你可以做Dog realDog=(Dog)Dog代码>也如果(dog是dog)
应该返回true,AFAIK。(你可以直接抛出对象另一个问题-我们需要关心什么是动物的具体类型吗?
?如果你关心-那么你不应该在这种情况下使用继承请坚持单一语言选择,它们可能相似,但可能完全不同。C提供了Dog realDog=Dog as Dog
,这将如果不属于该类,realDog
中的结果为null
。@FakeCaleb的“is”没有错,它只是为了找出某个对象是否是的子类。当您下一步将强制转换为子类时,您可以使用as。@TomSchardt我的观点是,最初的答案不会这样做,但只会看到对象是否是Dog
好奇大牛为什么不跟我保持联系that@FakeCaleb这样没有什么问题,但是as
读起来有点干净:Dog Dog=animal as Dog;if(Dog!=null)//使用Dog
vsif(Dog的动物实例){Dog Dog=(Dog)animal;//使用dog
,这仍然需要显式强制转换。@大牛很好奇,认为可能有原因,如果dog
不是dog
,这当然会引发异常。为避免上述异常:dog dogDog=dog as dog;
(如果不是狗,则为null
)我想问题不在于如何强制转换对象,而在于一般来说是否可以访问派生类的特定属性。@Fabio抱歉。我已经被带走了。或者更短的,如果(动物是狗)Dog.Bark();
@Fildor不错,甚至更好!
var mayBeDog = animal as Dog;
if (maybeDog != null)
{
// is Dog
}
else
{
// wasn't Dog
}