我们可以替换实现多个接口的所有类吗?

时间:2016-04-05 07:00:46

标签: java oop interface language-agnostic

我认为我们总是可以用多个接口替换类,例如:

public class C implements A,B{
}

进入另一个版本,每个类最多包含一个接口,是真的吗(我只想问问#34;如果我们可以......",不是"如果我们应该...... "在这里??

考虑C,它覆盖A中的方法a()和b()B:

public class C implements A,B{
    @override
    public void a(){
    }

    @override
    public void b(){
    }
}

它正在消除单一责任原则,因为改变a()或b()需要改变C,而我们可以用一个独立的类包装A和B:

public class ConcreteA implements A{
    @override
    public void a(){
    }
}

public class ConcreteB implement B{
    @override
    public void b(){
    }
}

public class C{
    ConcreteA a;
    ConcreteB b;
}

是真的吗?

即使你的班级只有一个责任,需要2个界面,仍然可以将其重写为仅在每个班级中的一个界面,例如原始版本:

public class C implements A,B{
    @Override
    public void a(){
    }

    @Override
    public void b(){
        a();
    }
}

在这种情况下,我们可以将其重写为:

public class ConcreteA implements A{
    @Override
    public void a(){
    }
}

public class C implements B{
    ConcreteA a;
    @Override
    public void b(){
        a.a();
    }
}

所以我的问题是,我们是否可以将包含2个以上接口的所有类替换为仅包含最多一个接口的版本?

如果没有,在什么情况下我需要实现多个接口来完成任务?

1 个答案:

答案 0 :(得分:0)

以前已经讨论过是否实现多个接口或使用多重继承违反单一责任原则的问题,例如here。关于它似乎没有明确的共识。我认为,您使用的SRP定义过于严格。

注释中提到的Serializable接口是一种特殊情况,因为它是一个不声明任何方法的标记接口。但是像Runnable这样的其他界面通常没有意义可以单独使用。

回到你的问题:是的,理论上它是可能的,但不是没有打破其他重要的原则,如干(不要重复自己)。想想一个类不仅实现在已实现的接口中声明的方法,而且还有自己的方法:

public class C implements A,B {
    public void a(){}
    public void b(){}
    public void c(){}
}

分裂导致:

public class CA implements A {
    public void a(){}
    public void c(){}
}

public class CB implements B {
    public void b(){}
    public void c(){}
}

现在方法c()重复。是的,您可以使用其他接口C或将此方法放入某种实用程序类中,但我会说这通常不会改进设计。