java - 通过 Java 接口(interface)传递设置 - 可能吗?

标签 java java-8 interface

假设我有两个类(class)。

public class Banana extends Fruit{    
    public Banana() {
        this.setTitle("Banana");
        this.setSize("Medium");
        this.setState("Rotten");
    }
}
public class Sausage extends Meat{    
    public Sausage() {
        this.setTitle("Sausage");
        this.setSize("Medium");
        this.setState("Rotten");
    }
}

有没有办法引入一个可以保存通用设置的界面(可能使用默认方法)?两个原始扩展名都应保留。

我已经用 google 搜索了接口(interface)和默认方法大约一个小时,并在 Java 聊天服务器上询问了这个问题,但我仍然很困惑。

最佳答案

您不能直接执行此操作。我认为您在这里基本上要求的是多重继承,而这个概念似乎让 Java 语言设计者非常恼火。不过,您可以自己实现类似的东西。

假设您有一个界面Food

public interface Food {    
    void setTitle(String s);
    void setSize(String s);
    void setState(String s);
}

然后你可以这样做:

public class BaseFood implements Food {  
    private String title;  
    private String size;  
    private String state;  
    // setters and getters...
}

然后是这个:

public class Banana extends Fruit implements Food {    
    private BaseFood food = new Food();
    public Banana() {
        food.setTitle("Banana");
        food.setSize("Medium");
        food.setState("Rotten");
    }
}

为了完整起见,这里是Sausage,它与Banana基本相同:

public class Sausage extends Meat implements Food {    
    private BaseFood food = new Food();
    public Sausage() {
        food.setTitle("Kielbasa");
        food.setSize("Medium");
        food.setState("Tasty");
    }
}

这称为“委托(delegate)”,您将 Java 中某个接口(interface)的实现委托(delegate)给另一个对象,仅声明它实现一个公共(public)接口(interface),然后仅调用实际实现该接口(interface)的私有(private)实例上的方法。它基本上是手动多重继承。

很常见的是,我的 IDE (NetBeans) 会为我完成大部分工作。给定一个接口(interface)和一个实现该接口(interface)的私有(private)实例成员,它将编写公开实现该接口(interface)所需的所有方法。它工作正常,但会生成大量样板文件。我有点希望 Java 人员至少能够为“多重继承问题”提供部分解决方案。

编辑:你说没有共同的基类,但你又说:

You cannot create a base class in this case since it's Java with its single inheritance - and both Sausage and Banana are already extending something. Unless I'm missing something you can see...

如果可以更改继承,则可以创建公共(public)基类:

class Food { ...
class Fruit extends Food {...
class Banana extends Fruit {...
class Meat extends Food {...
class Sausage extends Meat { ...

但我的回答假设您出于任何原因都不能这样做。

关于java - 通过 Java 接口(interface)传递设置 - 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55308920/

相关文章:

java - 使用对话框时如何在switch语句中添加while循环?

java - 如果使用 Files.find(),则出现 AccessDeniedException

java - 连接到 .NET REST 端点的 Android 中的对等错误间歇性连接重置

java - 将字符串转换为日期

java - 使用类作为键插入哈希表的通用方法

c# - 灵活使用 IDictionary(带接口(interface))

Java接口(interface)问题

java - 在 SortedMap(TreeMap) 中使用 'position' 更新 POJO 属性

java - 将 List<Map<String, List<String>>> 转换为 String[][]

Java 泛型 - 使用元素列表实现接口(interface)