有人可以解释
之间的区别ParentClass obj= new ChildChildClass();
和
ParentClass obj= new ParentClass();
既然
class ParentClass{
public void ParentClassMethod(){
}
}
class ChildClass : ParentClass{
public void ChildClassMethod(){
}
}
根据我的理解,两种情况下可访问的内容都是相同的。那有什么意义呢?
答案 0 :(得分:1)
您正在实例化两个完全不同的对象(在某种程度上,这两个对象恰好是ParentClass
)。虽然代码现在将它们视为相同的类型,但底层对象将是不同的。
我可以采取同样的想法,使其更加明显:
object o = "Hello World!";
object o2 = 15;
string
和int
都是对象,所以这很好。然而,基础类型在这里肯定是不同的。
答案 1 :(得分:1)
您可以覆盖虚拟方法。一个简单的例子:
void Main()
{
A realA = new A();
A actuallyB = new B();
Console.WriteLine(realA.GetName()); // John
Console.WriteLine(actuallyB.GetName()); // Gillian
PrintName(realA); // John
PrintName(actuallyB); // Gillian
}
public void PrintName(A anyA)
{
Console.WriteLine(anyA.GetName());
}
public class A
{
public virtual string GetName()
{
return "John";
}
}
public class B : A
{
public override string GetName()
{
return "Gillian";
}
}
你的两个类可以有不同的行为(当然在Liskov Substitution Principle的范围内),但辅助方法PrintName
可以同时使用。
事实上,这就是继承存在的全部原因 - 你暴露了一些有用的界面,每个使用它的人都可以单向处理它。如果你想要一个更真实的例子,让我们看一下Stream
类。例如,您可能有一个帮助方法从流中读取图像。现在,当您需要从文件中读取图像时,只需将文件流传递给辅助方法即可。如果要从数据库中读取图像,只需传递数据库流即可。当你想从web服务器读取图像时...只要流符合流接口(事实上,流不是完全设计完美;)),你可以随意切换它们,一切将按预期工作。
答案 2 :(得分:0)
很难说“差异在......”
这是称为继承的OOP原则之一。这意味着ChildClass同时是ParentClass。因此,您可以将这两种类型存储在ParentType类型的集合中,或者作为参数传递。但是要访问child的方法,你需要转换为孩子的类型。
答案 3 :(得分:0)
ParentClass obj = new ChildChildClass();
这里的obj实际上是一个ChildChildClass,你可以随时将它强制转换回ParentClass并调用ParentClass中可用的方法。
这种用法的优点是你可以拥有一些只使用ParentClass的常用功能,并且你也希望传递ChildChildClass,因为它也是一个ParentClass。