Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop C#OO设计:只需要一种抽象方法的情况_Oop_Design Patterns_Interface_Abstract Class_Virtual Functions - Fatal编程技术网

Oop C#OO设计:只需要一种抽象方法的情况

Oop C#OO设计:只需要一种抽象方法的情况,oop,design-patterns,interface,abstract-class,virtual-functions,Oop,Design Patterns,Interface,Abstract Class,Virtual Functions,我有两个类具有完全相同的逻辑/工作流,除了一个方法 因此,我创建了一个抽象基类,其中不同的方法被声明为抽象的 下面是一些示例代码来演示我的设计;有没有人能提供更好的方法的建议,或者我的方向是否正确。 我没有使用接口,因为派生类B和C实际上共享大部分逻辑。有没有更好的方法通过依赖注入来完成我下面要做的事情 public abstract class A { public void StageData() { // some logic DoSomet

我有两个类具有完全相同的逻辑/工作流,除了一个方法

因此,我创建了一个抽象基类,其中不同的方法被声明为抽象的

下面是一些示例代码来演示我的设计;有没有人能提供更好的方法的建议,或者我的方向是否正确。 我没有使用接口,因为派生类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!
    }
}

你所做的没有错。在这种设计中引入依赖项注入将是混乱和过度的-您必须传入一个委托:

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

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


    private Action _doSomthingAction;
}

您希望使用这种方法的原因不多,其中之一是如果您需要执行回调。所以,坚持你的模式,不要试图把事情复杂化。

你所做的没有错。在这种设计中引入依赖项注入将是混乱和过度的-您必须传入一个委托:

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

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


    private Action _doSomthingAction;
}

您希望使用这种方法的原因不多,其中之一是如果您需要执行回调。因此,请坚持您现有的模式,不要试图使事情过于复杂。

当然,这是C#/Java“实现共享”的一种方式(另一种是组合/代理)。然而,仅仅因为这两个类共享一个共同的祖先并不意味着接口没有用处——它们使存根和/或使用DI和/或完全替换等变得更加容易。(我开始喜欢接口,因为它们允许这样的类层次结构/实现分离:如果我正在创建一种新语言,我可能只允许通过“接口”指定类型,并鼓励接口专门化。)是的,我更喜欢在大多数情况下使用接口,但如何处理或减少重复代码逻辑?我通常将重复代码合并到“无状态”函数中(它们可能会调用没有保证的回调,也不一定保证输入没有变化,只是函数本身没有固有的状态)。只处理输入/输出的函数通常可以从多个位置干净地访问。继承提供了“全部功能”当然,这是C#/Java“实现共享”的一种方式(另一种是组合/代理)。然而,仅仅因为两个类共享一个共同的祖先并不意味着接口没有用处——它们使存根和/或使用DI和/或完全替换等变得更容易。(我开始喜欢接口,因为它们允许这样的类层次结构/实现分离:如果我正在创建一种新语言,我可能只允许通过“接口”指定类型,并鼓励接口专门化。)是的,我更喜欢在大多数情况下使用接口,但如何处理或减少重复代码逻辑?我通常将重复代码合并到“无状态”函数中(它们可能会调用没有保证的回调,也不一定保证输入没有变化,只是函数本身没有固有的状态)。只处理输入/输出的函数通常可以从多个位置干净地访问。继承提供了“全部功能”当然,我不想弄乱实例变量。这一点很好!我想让事情尽可能简单。我认为使用接口和DI非常有用,但在这种特定情况下肯定会有点过分。DI很好,但在这种情况下没有依赖性-
DoSomething()
不需要任何东西,它只是相同功能的不同实现。很好!我想让事情尽可能简单。我认为使用接口和DI非常有用,但在这种特定情况下肯定会有过多的麻烦。DI很好,但在这种情况下没有依赖性-
DoSomething()
不需要任何东西,它只是相同功能的不同实现。