Q值。如果要在未链接到接口的抽象类中创建抽象方法,您是否仍遵循编程到接口的原则?
我已经为我创建的所有UI类使用了一个接口;但是,鉴于接口的原因,我没有看到与我想要创建的抽象方法和现有接口的直接关联。
通常,我会创建抽象方法并完成;但是,我想知道我是否违反程序到接口的设计原则。
问。我应该为此创建另一个界面还是坚持使用抽象方法?
注意: 这不是界面与抽象类问题。
public abstract class BaseClass extends Clazz implements Interface {
// 1 out of 4 interface methods are implemented here
CustomObj getMode() { ... }
// I am actually also thinking of taking that 1 method - getMode() - out of the
// interface and implementing it as an implemented method without an interface.
// Method that made me ask this question!!
abstract CustomObj getDefaultMode(); // Not related to the interface - Interface
}
public interface Interface {
String getFirstNumber();
String getSecondNumber();
CustomObj getMode(); // This one is implemented in the BaseClass, but I think it no longer belongs in this role
// CustomObj getDefaultMode(); // This one is not in Interface, but makes be believe I need a new Interface or just have them declared in an Abstract Class.
}
注意:My Base类更多用于简化具体类中的代码。基类处理一些重写的方法,辅助方法,初始化等...所以它不像接口那样,而是作为标准的抽象类。
答案 0 :(得分:3)
Q值。如果要在未链接到接口的抽象类中创建抽象方法,您是否仍遵循Program to the Interface的原则?
答:抽象类也是一种接口**。这取决于你如何使用它:如果你将它用作某种界面 - 那么你仍然遵守这个原则。如果Abstract类是一个在后代之间重用代码的技术工具 - 那么这是一种违规行为。
您始终可以添加Interface2 extends Interface
以反映此方法的额外功能。你提到了这个选项 - 如果Abstract类不是"一个接口"它可能是有意义的。
有一种模式可以为不同的访问级别创建层次结构接口。例如:
User
interface - 用户详细信息的只读访问权限UserMaintainance extends User
interface - 允许更新用户详细信息。看起来你的情况可能属于这个定义。
**例如,在编程SPI时,将接口设置为抽象类有时会更好,因此可以保持与旧版本的向后兼容性。
答案 1 :(得分:2)
抽象类可能是诀窍,但正如Growing Object-Oriented Software, Guided by Tests一书所述,它会影响单元测试级别:
不要模拟混凝土类
使用Abstract类可能不会非常明确地显示与其协作者的各种潜在关系。
以下是关于这个问题的question,我几次问过这个问题,进一步了解这个问题。
你会告诉我:“但是一个抽象的课程不是具体的课程!”
我会称一个具体的课程,每一个收集某些行为的课程,以便出现一个实体。
抽象类可能经常实现属于各种职责的几种方法,因此降低了对象协作者的显性。
因此,我将“按角色编程”改写为“编程到界面”。
答案 2 :(得分:1)
我认为问题的措辞过于抽象,无法给出明确的是或否答案。
一般来说,抽象类没有任何问题。麻烦在于人们滥用它们。我们如何定义滥用?或者更确切地说,抽象类的正确使用是什么?
为此,我们必须记住OO是一种模拟“现实世界”的方式:好的设计提供易于理解的模型,糟糕的设计很难遵循。此外,良好的OO设计可以在模拟问题可能扩展的方向上扩展。 (我现在不是在谈论extends
关键字。)
抽象方法的含义如下:没有这个方法,在这个类中声明的其他方法没有任何意义。虽然接口所说的是X,但至少需要这些方法。
因此,虽然抽象方法是表达实现需求的一种方式,但是接口定义了实现它的任何人都可以扮演的角色。
有时你需要一个,有时你需要另一个。
答案 3 :(得分:0)
可以使抽象方法受到保护。接口方法不能。