Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 转换为子类_Java_C# - Fatal编程技术网

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
vs
if(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
}