【问题标题】:Point Structure in derived classes [closed]派生类中的点结构[关闭]
【发布时间】:2014-01-19 23:17:28
【问题描述】:

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

【问题讨论】:

  • 如果是作业,请添加作业标签。
  • 那么,到目前为止你有什么?
  • 只是一个流程图,正如我所说,我不太了解挑战。有人可以向我解释一下,或者告诉我如何使用点结构开始编码吗?我不需要一个完整的答案,我只需要帮助开始它。
  • 你想让我们做你的功课吗?请花些精力,不要只是从网上复制东西。如果这超出了您的范围,请尝试与您的教练交谈。我确定您的课程已经涵盖了这样做所需的材料
  • 你只需要实现任务中写的内容。这是简短的答案。

标签: shapes


【解决方案1】:

由于您只需要一个起点,因此这里是开始任务的方法(或几乎任何类似的方法;这就是我的做法,有多种方法):

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

using System.Drawing;

现在从第一点开始:

Shape 类有一个名为 Name 的属性、一个带有 Name 参数的构造函数和一个名为 GetArea 的 MustOverride 方法,该方法返回一个 Double。它有一个返回形状名称的 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;  }
    }
}

同样的变化适用于其他步骤,但仅此而已。

【讨论】:

  • 干得好@Mario,你很有耐心。
  • 为此 +1。至于TS,他/她应该认为自己很幸运,他/她得到了这个。通常这些类型的问题不会去任何地方哈哈。
  • 感谢@Mario,理解我的问题。我不是在寻找一个完整的程序,而是对挑战要求的解释。您对每项任务的解释都非常好,比书上的要好得多!
【解决方案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);
    }
}

【讨论】:

  • 感谢您的帮助。
  • @user3213304,不客气。
猜你喜欢
  • 2018-07-11
  • 1970-01-01
  • 2021-08-12
  • 2011-12-07
  • 2020-02-09
  • 2012-10-23
  • 2021-11-11
  • 2020-06-07
  • 2012-11-22
相关资源
最近更新 更多