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()?
在你的例子中,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(); //你可以实例化一个"形状",为什么你认为它是一个正方形?
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的实例的方法取决于实例所分配的变量的类型.这可以使调试变得有趣和有趣.