【问题标题】:C# GetName() , GetArea() for custom class "Shape" and it's derived classesC# GetName() , GetArea() 用于自定义类“Shape”及其派生类
【发布时间】:2017-06-11 10:32:15
【问题描述】:

我有一个任务:

有一个层次结构:“Shape” - 基类,“Triangle”,“Circle”,“Rectangle” - “Shape”的派生类,“IsoscelesTriangle” - “Triangle”的派生类,“Square” - 派生“矩形”类。 “Shape”有方法: GetArea() - 返回几何形状的面积,GetName() - 返回几何形状的名称。可以确定每个派生类的区域和名称。控制台程序利用名称和区域的输出信息演示了多态性的原理。

所以此时我的主要看起来像这样:

        Problem1_1.Shape triangle1 = new Problem1_1.Triangle("triangle1", 5, 10);
        double triangle1Area = triangle1.GetArea();
        string triangle1Name = triangle1.GetName();
        Console.WriteLine(triangle1Name, triangle1Area);

        Problem1_1.Shape isoTriangle1 = new Problem1_1.IsoscelesTriangle("iso triangle", 2, 10);
        double isoTriangle1Area = isoTriangle1.GetArea();
        string isoTriangle1Name = isoTriangle1.GetName();
        Console.WriteLine(isoTriangle1Name, isoTriangle1Area);

        Problem1_1.Shape circle1 = new Problem1_1.Circle("circle1", 5);
        double circle1Area = circle1.GetArea();
        string circle1Name = circle1.GetName();
        Console.WriteLine(circle1Name, circle1Area);

        Problem1_1.Shape rect1 = new Problem1_1.Rectangle("rectangle1", 2, 10);
        double rect1Area = rect1.GetArea();
        string rect1Name = rect1.GetName();
        Console.WriteLine(rect1Name, rect1Area);

        Problem1_1.Shape square1 = new Problem1_1.Square("sq1", 2, 3);
        double square1Area = square1.GetArea();
        string square1Name = square1.GetName();
        Console.WriteLine(square1Name, square1Area);

我的自定义类命名空间如下所示:

namespace Problem1_1
{
    public abstract class Shape
{
    protected Shape(string name)
    {
        Name = name;
    }
    public string Name { get; }

    public virtual string GetName()
    {
        return "Shape: " + Name;
    }

    public abstract double GetArea();

}

public class Triangle : Shape
{
    private double side;
    private double height;

    public Triangle(string name, double side, double height) : base (name)
    {
        this.side = side;
        this.height = height;
    }

    public override double GetArea()
    {
        double area = (side * height) / 2;
        return area;
    }
}

public class Circle : Shape
{
    private double radius;

    public Circle(string name, double radius) : base (name)
    {
        this.radius = radius;
    }

    public override double GetArea()
    {
        double area = radius * radius * Math.PI;
        return area;
    }
}

public class Rectangle : Shape
{
    private double side1;
    private double side2;

    public Rectangle(string name, double side1, double side2) : base (name)
    {
        this.side1 = side1;
        this.side2 = side2;
    }

    public override double GetArea()
    {
        double area = side1 * side2;
        return area;
    }
}

public class IsoscelesTriangle : Triangle
{

    public IsoscelesTriangle(string name, double side, double height) : base (name, side, height) { }

    public override double GetArea()
    {
        return base.GetArea();
    }
}

public class Square : Rectangle
{
    private double side1;

    public Square(string name, double side1, double side2) : base(name, side1, side2)
    {
        this.side1 = side1;
    }


    public override double GetArea()
    {
        double area = side1 * side1;
        return area;
    }
}
}

那么问题是什么。

首先,我的控制台消息没有给我该区域。它只给了我名字。我应该改变什么来获得两者?

其次,我不知道如何处理 Square 类。如果它是从矩形派生的,我怎么能只得到 1 个值来计算面积。如果我这样设置:

public Square(string name, double side1) : base(name, side1)

我遇到了一个错误。

【问题讨论】:

    标签: c#


    【解决方案1】:

    据我所知 Conosole.WriteLine(); 没有重载它允许您打印两个或多个这样的变量,您需要使用格式,例如, Console.WriteLine("{0} : {1}", triangleName, triangleArea); Console.WriteLine($"{triangle1Name} : {triangle1Area}");

    你能再解释一下第二个问题吗?

    【讨论】:

    • 下面的答案是我第二个问题的答案。感谢 console.writeline 的提示。这是我们第一次使用控制台输出任何消息。
    【解决方案2】:

    为什么要在构造函数中为 Square 的一侧传递两个值?您只需要一侧来定义一个 Square。

    Problem1_1.Shape square1 = new Problem1_1.Square("sq1", 2);
    double square1Area = square1.GetArea();
    string square1Name = square1.GetName();
    Console.WriteLine($"Name={square1Name}, Area={square1Area}");
    

    然后将Square的构造函数改为

    public class Square : Rectangle
    {
        private double side1;
    
        public Square(string name, double side1) : base(name, side1, side1)
        {
            this.side1 = side1;
        }
    }
    

    如您所见,您还可以删除 GetArea 的覆盖并让 Square (Rectangle) 的基类返回其计算结果。

    我还建议将 Rectangle 类中的两个边变量 protected 这样您也可以删除 Square 类中的变量 side1

    public class Rectangle : Shape
    {
        protected double side1;
        protected double side2;
        ...
    }
    

    最后,对于输出问题,只需要如上图正确使用Console.WriteLine即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-27
      • 1970-01-01
      • 2011-01-06
      • 2016-08-03
      • 2018-05-09
      • 1970-01-01
      相关资源
      最近更新 更多