我有兴趣学习OOP概念。在尝试使用继承的简单程序时。我注意到了这个错误。我无法理解为什么会出现这种错误?我在下面给出了简单的c#代码:
class Animal
{
public void Body()
{
Console.WriteLine("Animal");
}
}
class Dog : Animal
{
public void Activity()
{
Console.WriteLine("Dog Activity");
}
}
class Pomeranian : Dog
{
static void Main(string[] args)
{
//Dog D = new Dog();
Dog D = new Pomeranian(); -----> No error occur at this line
Pomeranian P = new Dog(); -----> Error occur at this line
D.Body();
D.Activity();
Console.ReadLine();
}
}
任何人请告诉我那里发生了什么......
答案 0 :(得分:9)
您必须了解每只狗都是动物的概念,但并非所有动物都是狗。
Program
是一个可怕的名字,让我们摆脱它并使之成为Pomeranian
:现在一切都将被清除。
Pomeranian P = new Dog();//This is not valid because not all dogs are Pomeranian.
但您可以执行以下操作
Dog d = new Pomeranian();//You know why this works :)
我希望这会有所帮助。
答案 1 :(得分:2)
您无法从类型child创建父实例。它违反了继承的概念。
答案 2 :(得分:2)
让我们确定您确定Dog
的实例实际上是Pomeranian
。您可以执行显式演员。
Dog dog = new Pomeranian();
Pomeranian pomeranian = (Pomeranian)dog; //explicit cast. This works. Would throw an InvalidCastException if the dog isn't a Pomeranian
您希望确定实例实际上是您要转换的类型,以避免异常。一种方法是使用GetType()
和typeof()
.
Dog dog = new Pomeranian();
if(dog.GetType() == typeof(Pomeranian))
{
Pomeranian p = (Pomeranian)dog; //explicit cast won't throw exception because we verified what we're doing is valid.
}
另一种方法是使用as
运算符。
Dog dog = new Pomeranian();
Pomeranian pomeranian = dog as Pomeranian; //If the dog isn't actually a Pomeranian, the pomeranian would be null.
使用as运算符基本上等同于......
Dog dog = new Pomeranian();
Pomeranian pomeranian = null;
if(dog.GetType() == typeof(Pomeranian))
{
pomeranian = (Pomeranian)dog;
}
显然,当你的所有代码都是同一块时,通过观察它就很容易分辨出基础类型。但是当你开始使用泛型集合和其他类似的东西并且你在课堂之间传递它们时,有时你不知道类型是什么,并且在演出之前检查类型变得很重要。
请参阅MSDN上的Casting and Type Conversions。
答案 3 :(得分:1)
自Program
子类Dog
以来,您无法从Program
获得Dog
。
但是对于多态性,Program
是Dog
,但不是相反。