【发布时间】:2012-01-26 14:18:25
【问题描述】:
我有 2 个类具有完全相同的逻辑/工作流程,除了一种方法。
所以,我创建了一个抽象基类,其中不同的方法被声明为抽象。
下面是一些示例代码来演示我的设计;任何人都可以就更好的方法提供建议,或者我是否朝着正确的方向前进。 我没有使用接口,因为派生类 B 和 C 实际上共享大部分逻辑。有没有更好的方法通过依赖注入来完成我正在做的事情?
public abstract class A
{
public void StageData()
{
// some logic
DoSomething();
}
public void TransformData();
public abstract DoSomething();
}
public class B : A
{
public override void DoSomething()
{
// Do Something!
}
}
public class C : A
{
public override void DoSomething()
{
// Do Something!
}
}
【问题讨论】:
-
当然,这是“实现共享”的一种 C#/Java 方式(另一种是组合/代理)。然而,仅仅因为两个类共享一个共同的祖先并不意味着接口没有用——它们使存根和/或使用 DI 和/或完全替换等变得更加容易。
-
(我开始喜欢接口,因为它们允许这样的类层次结构/实现分离:如果我正在创建一种新语言,我可能仅允许通过以下方式指定类型“接口”并鼓励接口专业化。)
-
是的,我也更喜欢使用接口,但是你如何处理或减少重复的代码逻辑?
-
我通常将重复的代码合并到“无状态”函数中(它们可能会调用回调,而这些回调是不保证的,并且它们不一定保证输入不会发生变异,只是函数本身没有固有状态)。只处理输入/输出的函数通常可以从多个位置干净地访问。当然,继承提供了处理实例变量的“全部力量”。
标签: oop design-patterns interface abstract-class virtual-functions