java - 通过 Java 中的接口传递设置 - 可能吗?
问题描述
假设我有两个班级。
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");
}
}
有没有办法引入一个可以保存通用设置的接口(可能使用默认方法)?两个原始扩展都应该保留。
我已经用谷歌搜索了大约一个小时的接口和默认方法,并在 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");
}
}
这称为“委托”,您将 Java 中某个接口的实现委托给另一个对象,只声明它实现了一个公共接口,然后只调用实际实现该接口的私有实例上的方法。它基本上是手动多重继承。
我的 IDE (NetBeans) 会为我完成大部分工作,这很常见。给定一个接口和一个实现该接口的私有实例成员,它将编写公开实现该接口所需的所有方法。它工作正常,但可以生成很多样板。我有点希望 Java 人员至少能在语言中为“多重继承问题”提供部分解决方案。
编辑:你说没有共同的基类,但后来你说:
在这种情况下,您不能创建基类,因为它是具有单一继承的 Java——而且 Sausage 和 Banana 都已经在扩展某些东西。除非我错过了你能看到的东西......
如果可以更改继承,则可以创建一个通用基类:
class Food { ...
class Fruit extends Food {...
class Banana extends Fruit {...
class Meat extends Food {...
class Sausage extends Meat { ...
但是我的回答假设您出于任何原因都不能这样做。
推荐阅读
- c++ - va_start - 32 位和 64 位版本之间的区别
- swift - 如何识别 XCUITest 在 xcode 中运行时抛出的一些随机寡妇
- xamarin.forms - MvvmCross:启动时 OnCreate() 中的 ArgumentNullException
- node.js - Node JS,NeDB - 如何使同步返回到父模块
- python - 如果是完美平方则返回 True/如果不是则返回 false
- python - 如何使用 Python 将 json 文件复制到 Amazon S3
- c# - C#:排序列表
实现 IReadOnlyDictionary ? - bash - 用抽象层控制交互式终端程序
- php - PHP foreach 不同的样式或 3 列(或 CSS?)
- ruby - 如何确定哪个 gem 拥有一个文件?