[英]Interface implementation and common function
我有以下要求,
对不起,我找不到定义问题的简单方法。 感觉就像是spring框架提供的解决方案。 但是我需要知道如何从Java / C#应用程序中实现这一点。
听起来您想要一个实现通用功能的抽象类,但是对于不同的功能仍然有两个具体的类。 您可能也可能不想保留界面。 因此,选项为:
Interface
^
|
Abstract
class
^
/ \
Concrete Concrete
class 1 class 2
要不就
Abstract
class
^
/ \
Concrete Concrete
class 1 class 2
想要使用这些类的代码仅使用接口或抽象类。 如何配置要使用的具体类取决于您的确切要求-但大概您已经在较早版本中解决了这一问题。
常见的模式是:
许多JDK类都可以做到这一点。 例如, List<T>
接口具有AbstractList<T>
抽象类,该抽象类被扩展为提供ArrayList<T>
和LinkedList<T>
。
一个简单的(如果有人为的)示例将类似于:
interface IntThingy {
int getValue();
int getDoubeValue();
}
abstract class AbstractIntThingy implements IntThingy {
@Override
public int getDoubleValue() {
return getValue() * 2;
}
}
class ConstantFourtyTwo extends AbstractIntThingy {
@Override
public int getValue() {
return 42;
}
}
class ConstantIntThingy extends AbstractIntThingy {
private final int value;
ConstantIntThingy(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
}
请注意,一旦Java 8到来,您就可以在接口中定义方法。 这些通常称为“防御者方法”。 发生这种情况时,您可能不需要抽象类-取决于该通用功能是否需要维持其自己的状态(接口仍然无法定义实例状态)。 但是就目前而言,界面抽象的模式通常效果很好。
您可以尝试避免使用简单的界面并使用策略模式:
创建一个实现您的接口并包含“通用功能”的具体类(或更好的抽象类),现在您可以使用两个(或更多)类来扩展该类(层次结构)。
设计此需求的方法还有很多。 而且我也不确定我的最好。
只是为了补充Jon Skeet的答案,您需要考虑您的类与接口或预期的抽象类之间的关系。 如果接口之间的行为之间的关系为has-a,则接口是正确的选择;如果接口为is-a,则可以使用抽象类。
在另一种情况下,您还可以检查该关系是否为has-a,并且要实现的新通用功能是is-a关系,那么除了Jon的选择之外,您还可以使用以下方法:
Abstract
class
^
/ \
Interface Interface
\ /
Concrete Concrete
class 1 class 2
例如:
interface IParent{}
abstract class Parent{}
class Child1: Parent, IParent{}
class Child2: Parent, IParent{}
这完全取决于您如何设计类以供将来使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.