【问题标题】:C# OO Design: case when only ONE abstract method is neededC# OO 设计:只需要一个抽象方法的情况
【发布时间】: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


【解决方案1】:

你所做的并没有错。在这个设计中引入依赖注入会很麻烦而且过大——你必须传入一个委托:

public class ABC
{
    public ABC(Action z)
    {
        _doSomethingAction = z;
    }

    public void DoSomething()
    {
        _doSomthingAction.Invoke();
    }


    private Action _doSomthingAction;
}

您想要使用这种方法的原因很少 - 一个原因是您需要执行回调。所以坚持你的模式,不要试图让事情变得过于复杂。

【讨论】:

  • 好点!我想让事情尽可能简单。我认为使用接口和 DI 非常有用,但在这种特定情况下肯定会过大。
  • DI 很好,但在这种情况下没有依赖关系 - DoSomething() 不需要任何东西,它只是相同功能的不同实现。
猜你喜欢
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多