使用子类实例化的父对象有什么用处

Dr.*_*len 5 c# oop inheritance

请告诉我使用子类实例化的父对象是什么:

 public class A
    {
        public A()
        {
            Console.WriteLine("A");
        }
        public virtual void method()
        {
            Console.WriteLine("AM");
        }

    }
    public class B : A
    {
        public B()
        {
            Console.WriteLine("B");

        }
        public new void method()
        {
            Console.WriteLine("BM");

        }
        public void method1()
        {
            Console.WriteLine("BM1");
        }
    }

 class Program
    {
        static void Main(string[] args)
        {
            A obj = new B();// what is use of it?
            obj.method();              
            Console.Read();
        }
        private void methodP1()
        {

        }
    }
Run Code Online (Sandbox Code Playgroud)

请告诉我什么是使用Parent obj = new Child(); 因为我只能调用父类的公共方法,这可以使用Parent obj = new Parent();

是可能的:Child obj = new Parent()?

Bro*_*ass 9

请告诉我什么是使用Parent obj = new Child(); 因为我只能调用父类的公共方法,这可以使用Parent obj = new Parent();

这是多态的基础:想象一下,你有几个继承自父类的子类.您希望通过父类中定义的接口/方法使用所有这些子类,而不必担心每个子类中的实现细节(每个子类可能做不同的事情,但具有相同的整体语义).

这是可能的,因为子类与其父类具有IS A关系,因为子类继承自父类.


Bri*_*new 6

在你的例子中,B -A A,但A 是-not-a B.

以上是使用当使用参考到B的代码只能了解(或需要理解)的类型A,B的是专业化 A的想象像(伪代码)

Shape s;
if (x == 1) {
  s = new Square();
}
else {
  s = new Triangle();
}
// following code knows only about Shapes
s.draw();
s.calculateArea();
Run Code Online (Sandbox Code Playgroud)

以下代码不需要知道s是正方形还是三角形,只是它是一个形状.有什么用?如果你打电话s.draw(),形状本身决定了它的外观.调用它的代码不知道或不关心.

这是面向对象编程的关键点.要求对象为你做事,而不是确定自己需要什么.

请注意,使用此示例时,您的最终问题并不直观.

Shape s = new Square(); //很好

VS

Square s = new Shape(); //你可以实例化一个"形状",为什么你认为它是一个正方形?


Nei*_*oss 6

BrokenGlass的答案是正确的.但是,您的样本将具有不同的行为,具体取决于您是声明obj为类型A还是B.

A obj = new B();程序的情况下将输出AB AM,因为编译器链接到虚拟方法A.method,然后B类继承.

B obj = new B();程序输出AB BM 的情况下,因为编译器被指示使用方法B.method().

如果B.method()被声明为public override void method(),则输出将始终为AB BM,无论obj是声明为类型A还是类型B.

因此,您的示例不会在经典意义上显示多态性,因为调用类型B的实例的方法取决于实例所分配的变量的类型.这可以使调试变得有趣和有趣.