请解释 Shape r = new Square() 的结果以及为什么 Square 的方法不可用

Please explain the outcome of Shape r = new Square() and why Square's methods aren't available

我正在研究 Jeff Fritz 的 c# tutorial videos,并且有一些像这样的代码使用了抽象 class:

public abstract class Shape {}
public class Rectangle : Shape {}
public class Square : Rectangle {
    public string SquareOnlyMethod() { return "I am a square"; }
}


public static void Main()
{
    Square s = new Square(); 
    
    Console.WriteLine(s.GetType());            // Square
    Console.WriteLine(s is Shape);             // True
    Console.WriteLine(s is Rectangle);         // True
    Console.WriteLine(s is Square);            // True
    Console.WriteLine(s.SquareOnlyMethod());   // I am a square
    
    Shape r = new Square();
    
    Console.WriteLine(r.GetType());            // Square
    Console.WriteLine(r is Shape);             // True
    Console.WriteLine(r is Rectangle);         // True
    Console.WriteLine(r is Square);            // True
    Console.WriteLine(r.SquareOnlyMethod());   // 'Shape' does not contain a definition for 'SquareOnlyMethod' and no extension method 'SquareOnlyMethod' accepting a first argument of type 'Shape' could be found
}

有人可以解释一下吗?

  1. 当我们Shape r = new Square();时实际上创建了什么?是 Shape 还是 Square
  2. 为什么GetType return Square 但是找不到Square class 中的方法?

Jeff 说(如果我理解正确的话)“'Shape` 是用 Square 的足迹创建的”,但随后继续前进。

Fiddle

您看到的问题从以下行开始 Shape r = new Square(); 因为即使您创建的是 Square 但使用的是基本类型。我假设 Jeff 试图向您展示的概念是 Polymorphism,可以在此处查看形状问题的更好示例 https://docs.microsoft.com/en-us/dotnet/csharp/fundamentals/object-oriented/polymorphism.

在 Microsoft 示例中,您看到基础 class 为任何派生 class(形状)提供通用功能以利用、扩展或覆盖。因此,您可以潜在地将不同 Shape 子级的单个数组视为 Shapes 并访问或调用跨任何子级形状(因此有多种形式)的方法(用于覆盖的虚拟方法)。

var shapes = new List<Shape>
{
    new Rectangle(),
    new Triangle(),
    new Circle()
};

// Polymorphism at work #2: the virtual method Draw is
// invoked on each of the derived classes, not the base class.
foreach (var shape in shapes)
{
    shape.Draw();
}