【问题标题】:How to create generic method for comparing two objects [closed]如何创建用于比较两个对象的通用方法[关闭]
【发布时间】:2019-07-27 18:51:07
【问题描述】:

好的。编写一个具有 Class 2D 类的程序,该类包含计算体积和表面形状的方法。然后 创建继承 Class 2D 类并实现其方法的类 Rectangle、Circle 和 Triangle。对于 Rectangle、Circle 和 Triangle 类来声明计算体积和表面所需的属性。然后制作一个ShapeUtill 类。 ShapeUtill 类应该包含并实现静态方法 体积和表面两种形式的比较(共2种方法)。方法应该接收泛型类型,例如 必须是Form 2D继承的类的参数

在我的主要问题之前,我尝试从一个类到另一个类实现(覆盖)方法,我这样做是好的还是?

 @Override
 public void areaAndVolumeOfCircle(Circle c) {
 double areaCircle = Math.pow(c.getR(), 2) * Math.PI;
 double volumeCircle = 2 * c.getR() * Math.PI;
 }

所以我的主要问题是,如何实现两种通用方法来比较两个形状(圆形、矩形或三角形)的面积和体积。

在我的 Shape2D 类中,我有以下方法:

    public void areaAndVolumeOfCircle(Circle c) {
    double areaCircle = Math.pow(c.getR(), 2) * Math.PI;
    double volumeCircle = 2 * c.getR() * Math.PI;
    }

    public void areaAndVolumeOfRectangual(Rectangular r) {
    double areaRectangle = r.getA() * r.getB();
    double volumeRectangle = (2 * r.getA()) + (2 * r.getB());
    }

    public void pIObimTrougla(Triangle t) {
    double areaTriangle = t.getA() + t.getB() + t.getC();
    double volumeTriangle = (t.getB() * t.getH() / 2);
    }

另外,Circle, Rectangular, Triangle 类扩展了Shape2D 类。

所以我想在新类ShapeUtil 中实现两个静态泛型方法来比较两个对象。

我用这种方法试过了,但是不行(类型Circle不带参数)

   public static <T, I> void compare(Cicle<T, I> c, Rectangular<T, I> r) {

   }

谢谢你,如果我需要更好地解释的话,我在这里!

【问题讨论】:

  • 在 Shape2D 中创建一个抽象的area() 方法,并在每个子类中覆盖它。删除所有 areaAndVolumeOfXxx 方法。然后写一个方法compareByArea(Shape2D shape1, Shape2D shape2)
  • @JohnWilliams 这就像想用锤子旅行。锤子对某些任务很有用,比如敲钉子。但不适合旅行。泛型在这里没用。给定您的代码,您应该首先学习一些重要的概念,例如继承、多态、实例与静态方法/
  • 我告诉过你怎么做:在 Shape2D 中创建一个抽象 area() 方法,并在每个子类中覆盖它。那么,你试过这样做吗?我还告诉过你,使用泛型来解决这个问题是没有意义的。您是否阅读并理解此评论?
  • 标记了你的评论,这家伙比你更懂 Java。而这绝对不是泛型应该解决的问题
  • 请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange (SE) 网络上发帖,您已在 CC BY-SA 3.0 license 下授予 SE 分发内容的不可撤销的权利(即无论您未来的选择如何)。根据 SE 政策,分发非破坏版本。因此,任何破坏行为都将被撤销。请参阅:How does deleting work? …。如果允许删除,则帖子下方左侧有一个“删除”按钮,但仅在浏览器中,而不是移动应用程序中。

标签: java generics


【解决方案1】:

我认为您应该创建一个抽象类Shape2D,它将成为您所有图形(圆形、矩形等)的超类。您创建一个方法compareArea 和一个抽象方法area

abstract class Shape2D {
    double area = 0;

    abstract double area();

    int compareArea(Shape2D that) {
        return Double.compare(this.area, that.area);
    }
}

class Circle extends Shape2D {
    private float radius;

    public Circle(float r) {
        this.radius = r;
        area = area();
    }

    @Override
    public double area() {
        area = 3.14 * this.radius * this.radius;
        return area;
    }
}

class Rectangle extends Shape2D {
    private float side1, side2;

    Rectangle(float side1, float side2) {
        this.side1 = side1;
        this.side2 = side2;
        area = area();
    }

    @Override
    public double area() {
        area = side1 * side2;
        return area;
    }
}

我认为你应该阅读一些 Java 书籍来了解 Java 和 OOP 是如何工作的,它会为你节省很多时间,而不是考虑做一些不可能的事情,比如用泛型做这件事。

【讨论】:

  • 你能告诉我为什么我不能用通用做这个吗?是不是因为圆形和三角形不能保存String类型?
  • 你能告诉我我适合那个吗?
  • 不,你的理由不正确
  • @JohnWilliams:你的 cmets 关于 Circle 类型作为字符串,恐怕真的没有意义
【解决方案2】:

首先,我的解决方案是尝试以低耦合实现高内聚。我真的不明白为什么你的方法不返回任何东西并计算两个不同的东西(面积和体积)

有一个比较属于同一层次结构的两个对象的类听起来很奇怪,我不明白为什么 Circle 有泛型。

话虽如此,这种设计为您提供了一种比较对象的方法,将逻辑推向类避免

abstract class Shape2D {
    abstract double area();
    boolean isBiggerThan(Shape2D shape) {
        return this.area() > shape.area();
        //or volume, or create a method hasBiggerAreaThan and hasBiggerVolumeThan
    }
}


class Rectangle extends Shape2D {
    /*Create constructor of rectangle*/

    @Override
    double area() {
        return this.height * this.width;
    }
}

【讨论】:

    猜你喜欢
    • 2013-12-10
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 2011-04-26
    相关资源
    最近更新 更多