Java接口\抽象类压缩

Java接口\抽象类压缩,java,android,interface,abstract-class,Java,Android,Interface,Abstract Class,今天,我们的团队遇到了问题 有一个类AClass,它实现接口AInterface。到目前为止,我们需要引入一个新的实体(BClass),它只使用接口a的一部分 我们考虑的第一件事——将接口接口拆分为两个组件(组合) 问题在于逻辑AClass->AInterface-是一个模型prom模式MVC。我们极不希望将其分割成几个接口。 我们知道Java提供了一种继承机制来扩展类或接口 但有没有办法限制实施?或者可能以另一种方式存在 注意:我们不希望使用不受支持的MethodException。我们的

今天,我们的团队遇到了问题

有一个类AClass,它实现接口AInterface。到目前为止,我们需要引入一个新的实体(
BClass
),它只使用接口a的一部分

我们考虑的第一件事——将接口接口拆分为两个组件(组合)

问题在于逻辑
AClass->AInterface
-是一个模型prom模式MVC。我们极不希望将其分割成几个接口。

我们知道Java提供了一种继承机制来扩展类或接口

但有没有办法限制实施?或者可能以另一种方式存在

注意:我们不希望使用不受支持的MethodException。我们的目标是清洁API

更新: 下一个解决方案——不适合我们

目标:

将受限子集放入一个接口中,并让较大的接口扩展它。然后让A实现子(较大)接口,B实现父(较小)接口。然后A和B都实现较小的接口,而只有A实现较大的接口。尽可能使用较小的界面进行编码

public interface AInterface {
    void add();
    void remove();
}

public interface ASubInterface extends AInterface {
    void invalidate();
    void move();
}

public class AClass implements ASubInterface { /* 4 methods */ }
public class BClass implements AInterface { /* 2 methods */ }

将受限子集放在一个接口中,并让较大的接口扩展它。然后让A实现子(较大)接口,B实现父(较小)接口。然后A和B都实现较小的接口,而只有A实现较大的接口。尽可能使用较小的界面进行编码

public interface AInterface {
    void add();
    void remove();
}

public interface ASubInterface extends AInterface {
    void invalidate();
    void move();
}

public class AClass implements ASubInterface { /* 4 methods */ }
public class BClass implements AInterface { /* 2 methods */ }

您有一个用例,它只需要原始接口中公开的方法的一半,这一事实告诉您可以进一步分解该接口。如果你考虑一下设计——你的对象在你的用例场景中如何表现,你会告诉你应该如何设计它


只要看一下您给出的方法的名称,我就认为它们是两个不同的接口,其中AClass实现两个接口,而BClass只实现第二个接口

您有一个用例,它只需要原始接口中公开的方法的一半,这一事实告诉您可以进一步分解该接口。如果你考虑一下设计——你的对象在你的用例场景中如何表现,你会告诉你应该如何设计它


只要看一下您给出的方法的名称,我就认为它们是两个不同的接口,其中AClass实现两个接口,而BClass只实现第二个接口

如果单独编译AClass和BClass,就可以这样做。即,使用接口的完整版本编译AClass,然后修改接口(删除方法),并使用此修改版本的接口编译BClass。
另外,这绝不是一种无痛的方法。

如果单独编译AClass和BClass,就可以做到这一点。即,使用接口的完整版本编译AClass,然后修改接口(删除方法),并使用此修改版本的接口编译BClass。


注:这绝不是一种无痛的方法。

您的需求似乎有点严格,但也许一个抽象类会有所帮助

public interface AInterface {

    public void add();

    public void remove();

    public void invalidate();

    public void move();
}


public abstract class BBase implements AInterface {
    @Override
    public abstract void add();

    @Override
    public abstract void remove();

    @Override
    public void invalidate() {};

    @Override
    public void move() {};

}

public class BClass extends BBase {

    @Override
    public void add() {
    }

    @Override
    public void remove() {
    }

}

在这里,我创建了一个BBase,它剔除了您想要删除的两个方法,但保留了另外两个抽象方法。BClass演示了如何使用它。

您的需求似乎有点严格,但抽象类可能会有所帮助

public interface AInterface {

    public void add();

    public void remove();

    public void invalidate();

    public void move();
}


public abstract class BBase implements AInterface {
    @Override
    public abstract void add();

    @Override
    public abstract void remove();

    @Override
    public void invalidate() {};

    @Override
    public void move() {};

}

public class BClass extends BBase {

    @Override
    public void add() {
    }

    @Override
    public void remove() {
    }

}
在这里,我创建了一个BBase,它剔除了您想要删除的两个方法,但保留了另外两个抽象方法。BClass演示了如何使用它。

在某些情况下不能“禁用”多态性,它是Java语言的一个主要功能

如果BClass不应该有这些方法,那么它就不应该实现接口

AClass比BClass做的更多,所以它应该是另一种类型。你为什么希望它们可以互换

另一方面,许多库使用不受支持的MethodException(甚至像带有列表集合的JavaSDK)。它只需要适当地记录。因此,如果您需要使用它来实现您的目标,那就去吧。

在某些情况下,您不能“禁用”多态性,它是Java语言的一个主要特性

如果BClass不应该有这些方法,那么它就不应该实现接口

AClass比BClass做的更多,所以它应该是另一种类型。你为什么希望它们可以互换


另一方面,许多库使用不受支持的MethodException(甚至像带有列表集合的JavaSDK)。它只需要适当地记录。因此,如果你需要使用它来实现你的目标,那就去做吧。

简短回答:不(收缩接口),不要拆分它。@user3580294你的答案看起来太不令人信服了。你说的不令人信服是什么意思?是的,它很短。这就是为什么它是一个评论而不是一个完整的答案。@user3580294不令人信服。太令人信服了吗?我会说我的答案不够有说服力,因为缺少支持它的信息。简短的回答:不(压缩接口),除了拆分它。@user3580294你的答案看起来太不令人信服了。你说的不令人信服是什么意思?是的,它很短。这就是为什么它是一个评论而不是一个完整的答案。@user3580294不令人信服。太令人信服了吗?我会说我的答案不够有说服力,因为缺乏信息支持。你的答案是我问题中的第二张图片。“我需要一种更无痛的方法。”迪瑟姆博说,其实不是。请注意一个接口是如何扩展另一个接口的。@user3580294实际上这并不能解决我的问题。@deathember您的第二张图片没有反映您所描述的内容以及Ernest提供的内容。此外,您希望将接口保存在一个文件中的愿望可能与解决问题所需的操作不匹配。你可能需要考虑放松这个限制,或者寻找另一种方法,如果这对你不起作用。看东西很标准