【问题标题】:Abstract class doesnt return anything抽象类不返回任何东西
【发布时间】:2023-03-14 10:33:01
【问题描述】:

这是我的代码:

class Program
{
    abstract class Shape
    {
        public abstract double GetArea();
    }
    class Rectangle : Shape
    {
        double length = 100.57;
        double width = 100.14;

        public override double GetArea()
        {
            double result = length * width;

            return result;
        }
    }
    class Circle : Shape
    {
        double radius = 50.34;

        public override double GetArea()
        {
            double result = Math.PI * Math.Pow(radius, 2);

            return result;
        }
    }
    static void Main(string[] args)
    {
        
    }
}

为什么它不返回任何东西?我想要我的 GetArea() 方法中的长度 * 宽度的结果以及圆的面积。我尝试了返回然后结果但是如果我启动应用程序没有任何反应。我也试过这样做:

static void Main(string[] args)
    {
        GetArea();
    }

但这只是红色下划线。

【问题讨论】:

  • 你的意思是new Rectangle().GetArea()
  • @canton7 我不知道该说什么我只想从我的 Rectangle 中获得长度 * 宽度的区域,然后在控制台中将其打印为双精度。
  • 你实际上并没有调用你这里写的代码,它只是进入Main方法,什么都不做然后退出。
  • 我怎么称呼它? @大卫G
  • 就像canton说的,你需要为你的每个类创建一个实例并调用GetArea方法。

标签: c# methods abstract


【解决方案1】:

您似乎对目标编程一无所知。你至少应该做一些关于 C#、类和对象的教程。

好吧,我至少会尝试澄清一些事情。

什么是类?类类似于对象的蓝图。例如,如果您有电视的技术计划,这就是您的课程。如果你有一台电视——设备——这就是你的对象。所以类是告诉如何创建和使用该类的对象的东西。

在您的代码中,您有三个类:

  • 抽象类 Shape - 这是一个抽象类,您不能创建该类的任何对象;这就像你想创造一个哺乳动物(不是人类,不是狗,不是猫,只是哺乳动物)。
  • 具体类Circle
  • 具体类 Rectange

现在您可以创建具体类的对象。但你不要在这里做。 您尚未创建任何矩形并想获取它的面积。

再看看你的 Rectangle 类。 正如我所说 - 这是一堂课。只是一个蓝图。但是你通过定义它的宽度和长度使这个类变得非常窄。此类仅代表一个矩形(与圆形相同)。这是一个糟糕的课程。这个类应该代表任何矩形,而不仅仅是一个。所以让我们稍微改写一下:

class Rectangle : Shape
{
    double readonly length;
    double readonly width;

    public Rectangle(double length, double width)
    {
        this.length = length;
        this.width = width;
    }

    public override double GetArea()
    {
        double result = length * width;

        return result;
    }
}

这是一个更好的类,因为它可以表示任何矩形。所以现在你可以在你的 Main 函数中创建这个类的对象了:

Rectangle rect = new Rectangle(100.57, 100.14);
double area = rect.GetArea();

对你的圈子做同样的事情。请记住 - 多阅读有关目标编程的内容。

【讨论】:

    【解决方案2】:

    你已经做了很多类定义。这很好,但是类定义本身不会任何事情。它们只是对可以做什么的描述。

    您指示您的应用程序做什么?

    static void Main(string[] args)
    {
        
    }
    

    什么都没有。这就是为什么什么都没有发生的原因。

    为什么它不返回任何东西?我想要 GetArea() 方法中的长度 * 宽度的结果以及圆的面积。

    请注意,您从未指定要使用圆形或矩形。这应该是您的第一个线索,即您编写的代码实际上并没有按照您想要的方式指示编译器。

    OOP 的基本方法是首先实例化对象,然后根据需要使用对象。

    实例化是创造的一个花哨的词。类定义说明了圆的行为方式,但它不会为您创建圆。您必须告诉编译器“为我创建一个Circle 的实例”,这在代码中是通过new 关键字完成的。然后,当您拥有该实例时,您可以调用您在其类中定义的 GetArea 方法。

    因此:

    static void Main(string[] args)
    {
        Shape myCircle = new Circle();
        double circleArea = myCircle.GetArea();
    
        Console.WriteLine(circleArea);
    
        Shape myRectangle = new Rectangle();
        double rectangleArea = myRectangle.GetArea();
    
        Console.WriteLine(rectangleArea);
    }
    

    我确实质疑您是否没有跳得太多,因为您似乎在掌握 OOP 的基础知识之前就已经在尝试处理继承(抽象继承)。您可能想退后一步,先熟悉使用对象,然后再考虑继承。

    【讨论】:

    • 但你不必做 Shape myCircle = new Circle();你可以做 Circle myCircle = new Circle();也有影响吗?
    • @preqs:您的问题是继承的核心。如果你问这个问题,那么你还没有理解继承,我建议在尝试应用它之前参考你关于继承的课程材料。如果它有帮助,一个具体的用例:考虑有一个打印 any Shape 区域的方法会是什么样子你传递它,这个方法不知道(也不需要要知道)传递的对象是否是CircleRectangleTriangle,......它只知道它是一个Shape。这里的关键词是“多态性”。
    • 好的,现在我明白了,我有点理解多态性,只是不是这些抽象的东西。
    • @preqs:也许更直接一点,我故意使用Shape myCircle,因为您的代码是直接尝试使用继承和多态性,因此最好编写具体使用它的代码。
    • @preqs:abstract 唯一添加到继承和多态性的是不允许您直接执行 new Shape()。这就对了。当你想说“直接实例化它没有意义时,你在一个类上使用abstract。这个类只是一个半实现,应该被其他人继承来完成它的实现。实例化那些是有意义的派生类,但不是这个基类”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多