派生类中的点结构

时间:2014-01-19 23:17:28

标签: shapes

有人可以在派生类中阐明如何使用现有的点结构吗?

2 个答案:

答案 0 :(得分:3)

由于你只想要一个起点,这里是如何开始任务(或几乎任何类似的东西;这就是我如何做,有多种方法):

提到的现有点结构是System.Drawing.Point。因此,您很可能希望使用using指令使代码更短且更易读:

using System.Drawing;

现在从第一点开始:

  

Shape类有一个名为Name的属性,一个带Name参数的构造函数和一个返回Double的名为GetArea的MustOverride方法。它有一个ToString方法,返回形状的名称。

这很长,所以让我们分解一下:

  • 该类名为 Shape
  • 有一个属性名称
  • 构造函数具有参数 Name
  • 有一个未实现的方法 GetArea 返回double值( - >这将是abstract类。)
  • 有一个方法 ToString 返回名称。

如果您更容易,请在一张纸上写下这些详细信息。在尝试开始时它可以帮助你很多。然后尝试逐步执行此操作:

  
      
  • 该类名为 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);
    }
}