首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java接口扩展接口的优化

java接口扩展接口的优化
EN

Stack Overflow用户
提问于 2014-08-25 11:50:50
回答 6查看 99关注 0票数 4

我有一个接口A,有两种方法:

代码语言:javascript
复制
public interface A{
    method One();
    method Two();
}

我对interface B有两种选择

案例1:

代码语言:javascript
复制
public interface B{
    method One();
    method Two();
    method Three();
}

案例2:

代码语言:javascript
复制
public interface B extends A{
    method Three();
}

有谁能告诉我这两种情况中哪一种更适合实施,为什么呢?第二种情况的缺点是什么?

编辑:在界面B中,我需要界面A的两种方法,所以,我认为扩展会更好。有些类只需要方法一和方法二,在那里实现接口A,在需要方法一、方法二和方法三的地方,我实现了接口B。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-08-25 12:00:40

这取决于你的逻辑。考虑这两对接口:

代码语言:javascript
复制
interface House {
    int doorCount();
    int windowCount();
}

interface Automobile {
    int doorCount();
    int windowCount();
    int wheelCount();
}

没有一个头脑正常的人会通过扩建房子来获得Automobile,因为汽车不是有轮子的房子。

另一方面,在这种情况下

代码语言:javascript
复制
interface House {
    int doorCount();
    int windowCount();
}

int Mansion extends House {
    int poolCount();
}

House派生出来是有意义的,因为Mansion是一种具有“附加特性”的House

票数 4
EN

Stack Overflow用户

发布于 2014-08-25 11:53:21

这取决于你需要做什么。如果method Three()引入了从设计角度来看应该封装到另一个单元(例如接口或类)的功能,那么使用2,如果它的功能类似,使用1。

编辑:还有一个选项:接口之间没有扩展,具体类可以同时实现它们,但同样取决于您需要什么

EDIT2:编辑之后,它仍然没有多大的区别。静态类可以实现两个接口或一个接口,还可以对两个类使用多态赋值。例如,如果class concreteA implements interfaceAclas concreteB implements interfaceBclass concreteB implements interfaceA, interfaceB仍然可以执行InterfaceA classB = new concreteB();

票数 4
EN

Stack Overflow用户

发布于 2014-08-25 11:55:56

如果使用案例1,并且已经有针对类型A编写的客户端代码,那么它将无法处理实现B的类的实例,这完全是因为一个繁文缛节的原因:B在概念上是A的一个扩展,但在Java系统中建模为一个完全不同的类型。

示例:

代码语言:javascript
复制
static void existingMethod(A a) {
  ...work with a ...
}

class ImplB implements B { ... }

public static void main(String... args) {
   B b = new B();
   existingMethod(b); // compile error for Case 1; Case 2 compiles fine.
}

因此,让您的B类型扩展A更有意义。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25485271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档