Java方法重载中参数相同时的数量问题

3
我遇到了一个问题,需要使用方法重载计算球体、圆柱体和锥体的体积。以下是我的代码,绝对没有问题:
import java.util.*;
class Vol_Sph_Cyl_Con
{
    void calc_volume(double sp_rd)
    {
        double volume=(4*3.14*(Math.pow(sp_rd,3)))/3;
        System.out.println("Volume of the sphere is "+volume+" cc");    
    }
    void calc_volume(double cyl_rd, double cyl_he)
    {
        double volume=3.14*(Math.pow(cyl_rd,2))*cyl_he;
        System.out.println("Volume of the cylinder is "+volume+" cc");
    }
    void calc_volume(double con_rd,double con_he,double pie)
    {
        double volume=(pie*(Math.pow(con_rd,2))*con_he)/2;
        System.out.println("Volume of the cone is "+volume+" cc");
    }
    public static void main(String args[])
    {
        Scanner sc=new Scanner(System.in);
        Vol_Sph_Cyl_Con ob=new Vol_Sph_Cyl_Con();
        double sp_rad=0.0;
        do 
        {
            System.out.println("Enter radius of sphere to calculate the volume (in centimetres)");
            sp_rad=sc.nextDouble();
            if (sp_rad<=0)
            {
                System.out.println("Error!");
            }
        }while (sp_rad<=0);
        ob.calc_volume(sp_rad);
        double cyl_rad=0.0, cyl_hei=0.0;
        do
        {
            System.out.println("Enter the radius and the height of cylinder respectively to calculate volume (in centimetres)");
            cyl_rad=sc.nextDouble();
            cyl_hei=sc.nextDouble();
            if (cyl_rad<=0 || cyl_hei<=0)
            {
                System.out.println("Error!");
            }
        }while (cyl_rad<=0 || cyl_hei<=0);
        ob.calc_volume(cyl_rad,cyl_hei);
        double con_rad=0.0, con_hei=0.0, pi=3.14;
        do
        {
            System.out.println("Enter radius and height of cone respectively to calculate volume (in centimetres)");
            con_rad=sc.nextDouble();
            con_hei=sc.nextDouble();
            if (con_rad<=0 || con_hei<=0)
            {
                System.out.println("Error!");
            }
        }while (con_rad<=0 || con_hei<=0);
        ob.calc_volume(con_rad,con_hei,pi);
      }
   }

这个程序本身没有问题,但是由于这是一个学校项目,我不能在计算圆锥体积的方法中传递参数'pie',因为我们不允许显式地传递不必要的参数。但如果我不这样做,参数数量就会相同。有没有解决办法,或者这只是问题出在问题描述上?


1
@mikeTheLiar 因为我们只能使用方法重载来完成任务。 - Shinjinee Maiti
@Zircon 你是指第二句话吗? - Shinjinee Maiti
@Zircon 嗯,这不是个坏主意......谢谢!! - Shinjinee Maiti
5
考虑使用 Math.PI 而不是 3.14。 - Bathsheba
2
在我看来,这是一个问题。仅使用方法重载来解决这个问题是可怕的。如果您想要计算更多物体的体积呢?比如说,对于常规的勾股立体体。所有这些方法都应该具有不同数量的参数是没有意义的。考虑使用类层次结构代替。 - tobias_k
显示剩余7条评论
3个回答

4
目前,你的参数是计算你想要计算体积的几何体的定义值。如果有两个或更多的几何体共享相同的定义值类型,你将会失去它们,因为你不能仅通过类型来区分它们,因为它们是相等的。正如tobias_k所指出的那样。
为了解决这个问题,你可以在代码中为每个需要计算体积的几何体添加一个表示。然后,这些表示可以用作你的体积计算方法的单个参数。
所以,你的例子中,你需要一个球体、一个圆柱体和一个圆锥体类。
public class Sphere {
}

public class Cylinder {
}

public class Cone {
}

由于这是一项作业,我们应该让您考虑如何设计这些类。您的重载方法应该如下所示:

void calc_volume(Sphere sphere) {}
void calc_volume(Cylinder cylinder) {}
void calc_volume(Cone cone) {}

如您所见,使用这种设计,您可以处理的几何对象数量不再受限制。


2
可以选择这种方式,或者让不同的“GeometricObject”类具有一个名为“calc_volume”的方法,但这种方式更接近于作业要求。 - tobias_k
@tobias_k:确切无误 - pintxo
1
这些类没有必要实现相同的接口。 - C.Champagne
@C.Champagne:过度工程的坏习惯。我已经把它们移除了。这样的东西很容易让初学者感到困惑。 - pintxo

2
无法让三种方法在两组参数上同时解决:如果你想为圆锥体和圆柱体都传递高度和半径,你必须更改其中一个方法的名称。
然而,你可以以不同的方式概括问题:不要使用两个单独的方法计算圆锥体和圆柱体的体积,而是使用一个单一的方法计算圆锥台的体积,这可以推广到圆柱体(顶部半径=底部半径)和圆锥体(顶部半径=0)。

enter image description here

这样你就只剩下两种方法了 - 一个适用于球体,另一个适用于圆锥和圆柱体:
void calc_volume(double top, double bottom, double height) {
    double v = Math.PI * height * (top*top + top*bottom + bottom*bottom) / 3;
     System.out.println("Volume is " + v + " cc");
}

当您调用此方法计算圆锥体积时,请将top设为0,将bottom设为底面半径。对于圆柱体,请将topbottom都设为底面半径。

0
一些人在评论中提到,在这种情况下使用方法重载相当丑陋。我个人也同意这一观点。
无论如何,您可以创建“参数”类来传递参数,这样您每次只需要一个参数。
例如,对于一个球体:
public class SphereArguments {
    private double radius;

    /**
     * @param radius
     */
    public SphereArguments(double radius) {
        this.radius = radius;
    }

    /**
     * @return the radius
     */
    public double getRadius() {
        return radius;
    }
}

calc_volume 将变成:

void calc_volume(SphereArguments arg)
{
    double volume=(4*Math.PI *(Math.pow(arg.getRadius(),3)))/3;
    System.out.println("Volume of the sphere is "+volume+" cc");    
}

并且调用:

ob.calc_volume(new SphereArguments(sp_rad));

当然,您还需要对圆柱体的CylinderArguments类和圆锥体的'ConeArguments'类进行同样的操作。

请注意,按照惯例,Java名称采用CamelCase格式,因此calc_volume应更改为calcVolume...


我不明白这与@pintxo的回答有什么不同... - tobias_k
@tobias_k 当 pintxo 提交答案时,我仍在撰写答案。我只是太慢了,但我也不想删除我的答案。唯一的区别是我的类没有实现任何特定的接口,这可能更好,但也不是必须的。 - C.Champagne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接