ParentClass obj = New ChildChildClass()和ParentClass obj = New ParentClass()有什么区别?

时间:2015-12-14 16:19:45

标签: c# .net class oop object

有人可以解释

之间的区别
ParentClass obj= new ChildChildClass();     

ParentClass obj= new ParentClass();

既然

class ParentClass{
   public void ParentClassMethod(){
   }
}

class ChildClass : ParentClass{
   public void ChildClassMethod(){
   }
}

根据我的理解,两种情况下可访问的内容都是相同的。那有什么意义呢?

4 个答案:

答案 0 :(得分:1)

您正在实例化两个完全不同的对象(在某种程度上,这两个对象恰好是ParentClass)。虽然代码现在将它们视为相同的类型,但底层对象将是不同的。

我可以采取同样的想法,使其更加明显:

object o = "Hello World!";
object o2 = 15;

stringint都是对象,所以这很好。然而,基础类型在这里肯定是不同的。

答案 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。