请解释 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
}
有人可以解释一下吗?
- 当我们
Shape r = new Square();
时实际上创建了什么?是 Shape
还是 Square
?
- 为什么
GetType
return Square
但是找不到Square
class 中的方法?
Jeff 说(如果我理解正确的话)“'Shape` 是用 Square 的足迹创建的”,但随后继续前进。
您看到的问题从以下行开始 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();
}
我正在研究 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
}
有人可以解释一下吗?
- 当我们
Shape r = new Square();
时实际上创建了什么?是Shape
还是Square
? - 为什么
GetType
returnSquare
但是找不到Square
class 中的方法?
Jeff 说(如果我理解正确的话)“'Shape` 是用 Square 的足迹创建的”,但随后继续前进。
您看到的问题从以下行开始 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();
}