【问题标题】:How to use the same add() method in two different classes如何在两个不同的类中使用相同的 add() 方法
【发布时间】:2014-03-23 22:46:59
【问题描述】:

您好,有没有一种方法可以在两个不同的类之间使用相同的 add() 方法(将内容添加到数组中)?例如我的湖类有以下 add() 方法:

 public void add (Fish aCatchableThing) 
    {
        if (numThings < catchableThings.length)
        {
            catchableThings[numThings++] = aCatchableThing;
        }
    }

我正在尝试使用以下代码使其工作:

public class FishingTestProgram3 
{
    public static void main(String [] args) 
    {

        Lake   weirdLake = new Lake(21);
        weirdLake.add(new AuroraTrout(76, 6.1f));
        weirdLake.add(new Tire());
        weirdLake.add(new Perch(32, 0.4f));
        weirdLake.add(new Bass(20, 0.9f));
        weirdLake.add(new Treasure());
        weirdLake.add(new Perch(30, 0.4f));
        weirdLake.add(new AtlanticWhiteFish(140, 7.4f));
        weirdLake.add(new RustyChain());
        weirdLake.add(new Bass(15, 0.3f));
        weirdLake.add(new Tire());

这将起作用(使用继承,即EndangeredFish extends fish, and Perch extends EndangeredFish ) 用于添加的所有鱼,但它不适用于对象(即轮胎,RustyChain,Treasure)。Tire,RustyChain 和 Treasure 是扩展 SunkenObject 类的类字面上是空的:

public abstract class SunkenObject
{


}

我尝试在 Lake 类中创建第二个 add 方法,但没有成功。我想知道是否有人对这如何工作有任何想法?我可以将所有东西(即鱼和沉没的物体)添加到同一个数组中,这样当

public void listAllThings() 
    {
        System.out.println("  " + this + " as follows:");
        for (int i=0; i<numThings; i++)
        {
            System.out.println("    " + catchableThings[i]);
        System.out.println();
        }

实现了数组中的所有内容都会打印出来。谢谢你的帮助

如果有人想知道这是我尝试过的 add() 方法

public void add (SunkenObject sunkenObject) 
    {
        if (numThings < catchableThings.length)
        {
            catchableThings[numThings++] = sunkenObject;
        }
    }

【问题讨论】:

  • 既然您将FishSunkenObject 添加到catchableThings,那么我建议您只保留一个一个添加方法。就像您的情况一样,逻辑错误可能会从任何地方弹出。 让所有的鱼和沉没对象继承CatchableThing

标签: java arrays oop methods


【解决方案1】:

创建一个公共基类,您想要添加的所有内容都从该基类派生。

【讨论】:

    【解决方案2】:

    考虑对接口而不是具体类型进行编程 - 例如ICatchable:

    public void add(ICatchable item)
    {
        // Add the catchable item to the lake.
    }
    

    【讨论】:

    • 非常轻微的挑剔,但在 Java 中接口通常不以 I 开头。
    • @ValekHalfHeart:谢谢。不,我不会说它一定是“非常轻微的”。这是一个公平的观点。不使用I 作为接口前缀是Java 习惯用法;我在 Java 聚会上带来了一个 C# 习语:这有点像坚持说“天哪!”应该是“¡Vaca santa!”用西班牙语……当“¡Dios mio!”确实是用西班牙语表达相同含义的惯用方式。尽管如此,在这种情况下,我仍将保留I 前缀,以使读者明白ICatchable 是一个接口。 ;)
    【解决方案3】:

    答案几乎就在问题中。您希望能够添加到湖中的不仅是 Fish 的实例。您希望能够添加的是可捕获的东西。所以你需要定义这样一个类型。

    FishSunkenObject 因此应该扩展一个名为CatchableThing 的公共基类,或者应该实现一个名为CatchableThing 的接口。

    并且add()方法的签名应该是

    public void add(CatchableThing aCatchableThing) 
    

    【讨论】:

      猜你喜欢
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多