由于您只需要一个起点,因此这里是开始任务的方法(或几乎任何类似的方法;这就是我的做法,有多种方法):
提到的现有点结构是System.Drawing.Point。因此,您很可能希望使用 using 指令来使您的代码更短且更具可读性:
using System.Drawing;
现在从第一点开始:
Shape 类有一个名为 Name 的属性、一个带有 Name 参数的构造函数和一个名为 GetArea 的 MustOverride 方法,该方法返回一个 Double。它有一个返回形状名称的 ToString 方法。
这很长,所以让我们分解一下:
- 这个类叫做Shape。
- 有一个属性名称。
- 构造函数有一个参数Name。
- 有一个未实现的方法 GetArea 返回一个
double 值(-> 这将是一个 abstract 类)。
- 有一个方法 ToString 返回名称。
如果这对您来说更容易,请在一张纸上写下这些详细信息。在尝试开始时,它可以为您提供很多帮助。然后尝试一步一步地做到这一点:
让我们从基本的类定义开始:
public class Shape {
}
所以这一点已经完成。下一个任务:
这有点复杂,有几种方法可以做到这一点。考虑到还有一个访问器(见后面的步骤),我不认为它是一个真实的属性,而只是一个成员变量(如果你不同意,请参阅我的答案的结尾)。数据类型没有命名,但由于我们希望它是一个简短的单词,我们将使用string。所以让我们添加它:
public class Shape {
private string Name;
}
现在我们需要构造函数:
这又是微不足道的。这是我们设置刚刚定义的Name 的地方:
public class Shape {
private string Name;
public Shape(string Name) {
this.Name = Name; // The use of 'this' is required, since both names overlap.
}
}
由于构造函数必须可从外部访问,我们将其定义为public。下一步有点棘手:
- 有一个未实现的方法 GetArea 返回一个
double 值(-> 这将是一个 abstract 类)。
所以让我们先分解一下。我们需要一个我们不会在这里实现的方法 GetArea。因此,必须使用同名关键字将类设为abstract。这意味着并非所有成员都已实现,但派生类必须自己实现它们。所以我们添加新成员方法的签名(= 没有函数体)以及关键字:
public abstract class Shape { // this 'abstract' tells the compiler that this class can't be instantiated
private string Name;
public Shape(string Name) {
this.Name = Name;
}
public abstract double GetArea(); // this 'abstract' forces derived classes to implement this method
}
如果您不确定关键字abstract 的作用,请再次阅读。虽然有很多方法可以使用它,但它使事情变得更容易和更优雅。现在只剩下一个简单的最后一步了:
再一次,这是微不足道的添加。再次没有命名数据类型,但由于我们计划返回 string,这又很容易分辨:
public abstract class Shape {
private string Name;
public Shape(string Name) {
this.Name = Name;
}
public abstract double GetArea();
public override string ToString() { // The 'override' keyword here is important since you want this to replace the default method of the same name.
return Name;
}
}
就是这样。你已经准备好你的基类了。要创建派生类,您所要做的就是命名基类,然后添加新成员。这是下一节课的准系统:
public class Rectangle : Shape {
// ...
}
如果你认为 Name 属性确实是一个属性,你可以这样实现它:
public class Shape {
private string name; // this is the actual variable behind the scenes.
// this is a getter/setter accessing the 'name' string
public string Name {
get { return name; }
set { name = value; }
}
}
同样的变化适用于其他步骤,但仅此而已。