有人可以在派生类中阐明如何使用现有的点结构吗?
答案 0 :(得分:3)
由于你只想要一个起点,这里是如何开始任务(或几乎任何类似的东西;这就是我如何做,有多种方法):
提到的现有点结构是System.Drawing.Point
。因此,您很可能希望使用using
指令使代码更短且更易读:
using System.Drawing;
现在从第一点开始:
Shape类有一个名为Name的属性,一个带Name参数的构造函数和一个返回Double的名为GetArea的MustOverride方法。它有一个ToString方法,返回形状的名称。
这很长,所以让我们分解一下:
double
值( - >这将是abstract
类。)如果您更容易,请在一张纸上写下这些详细信息。在尝试开始时它可以帮助你很多。然后尝试逐步执行此操作:
- 该类名为 Shape 。
让我们从基本的类定义开始:
public class Shape {
}
所以这一点已经完成了。下一个任务:
- 有一个属性名称。
这有点复杂,有几种方法可以做到这一点。考虑到还有一个访问器(参见后面的步骤),我不认为它是一个真正的属性而只是一个成员变量(如果你不同意,请参阅我的答案的结尾)。数据类型未命名,但由于我们希望它是一个简短的单词,我们将使用string
。所以让我们添加它:
public class Shape {
private string Name;
}
现在我们需要构造函数:
- 构造函数具有参数 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
的作用,请再次阅读。虽然有各种方法可以使用它,但它使事情变得更容易和更优雅。现在只剩下一个简单的最后一步了:
- 有一个方法 ToString 返回名称。
再一次,这是微不足道的补充。还没有命名的数据类型,但由于我们计划返回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; }
}
}
同样的变化适用于其他步骤,但就是这样。
答案 1 :(得分:2)
好的,虽然这些问题在stackoverflow中不太受欢迎,但我会为您提供课程,并将实例化业务留给您:
public abstract class Shape
{
protected Shape(string name)
{
Name = name;
}
public string Name { get; private set; }
public abstract double GetArea();
public override string ToString()
{
return Name;
}
}
public class Rectangle : Shape
{
public Rectangle(Point upperLeft, Point lowerRight)
: base("Rectangle")
{
this.upperLeft = upperLeft;
this.lowerRight = lowerRight;
}
private Point upperLeft;
private Point lowerRight;
public override double GetArea()
{
return (lowerRight.X - upperLeft.X) * (upperLeft.Y - lowerRight.Y);
}
}
public class Circle : Shape
{
public Circle(Point center, double radius)
: base("Circle")
{
this.center = center;
this.radius = radius;
}
private Point center;
private double radius;
public override double GetArea()
{
return Math.PI * Math.Pow(radius, 2);
}
}