这是使用遗产的正确方法吗?

时间:2015-12-03 17:01:54

标签: c#

如果不允许这些类型的问题,我很抱歉。

我有类似于插件的简单基础。 这是我的例子

class Plugin{
    private bool _Enabled;
    public bool Enabled{
        get{
            return _Enabled;
        }
        set{
            _Enabled = value;
            if(value)
                MyExecutionHandler += Run;
        }
    }

    public virtual void Run(object source, System.EventArgs args)
    {
        if(!Enabled)
            return;
    }
}

现在我正在做这样的事情:

class CustomPlugin : Plugin{
    public override void Run(object source, System.EventArgs args)
    {
        base.Run(source, args);
    }
}

首先是这个正确背后的逻辑吗?

其次我可以强制它们从partial类实现Run函数,还是需要为它创建一个接口?

2 个答案:

答案 0 :(得分:1)

这不是使用partial关键字的正确方法。 partial关键字仅允许您将类的定义分散到多个源文件中。它不是您用来描述程序架构的东西。您可以使用它将定义拆分为多个文件,如下所示:

Plugin1.cs

partial class Plugin{
    private bool _Enabled;
    public bool Enabled{
        get{
            return _Enabled;
        }
        set{
            _Enabled = value;
            if(value)
                MyExecutionHandler += Run;
        }
    }
}

Plugin2.cs

partial class Plugin {
    public virtual void Run(object source, System.EventArgs args)
    {
        if(!Enabled)
            return;
    }
}

但是这对你没有帮助,你应该忘记partial关键字(暂时)。您似乎正在努力解决与面向对象编程相关的概念。 partial关键字与此无关,所以不要担心。

如果您希望从Plugin继承的类被“强制”实施Run方法,则应使用abstract method。但是,正如您将在该链接中读到的那样,如果使用抽象方法,则无法定义当前在run方法体中定义的“默认”行为。

如果您希望强制从Plugin继承的类定义ADDITIONAL行为,那么仅使用抽象类/方法/接口等概念就无法轻松实现。您会发现它更容易妥协,并允许从插件继承的类“只”具有Run基类中描述的Plugin方法的默认行为。

您可能会发现这种妥协可以接受。我想你会发现强制继承Plugin的类在Run方法中做其他事情并不会给你带来任何好处。如果任何类型的派生Run的最小/无用“运行”,则基本Plugin方法中的行为仍应被视为“正确”。

我不能说你的程序的逻辑,不清楚你打算让这些插件做什么,但希望这将帮助你弄清楚你想要做什么,以及如何做。

答案 1 :(得分:1)

您可以使用"默认"定义abstract课程。通过将方法声明为virtual并在派生类中重写它来实现行为。

派生类不会被强制覆盖抽象基类中的virtual方法。如果未覆盖该方法,则使用抽象类中定义的行为。覆盖该方法可用于完全替换该行为,或实现其他功能(在调用base.MethodName()之上)。

除非我误解了您的问题,否则此模式应该适合您的情况。

dotnetfiddle链接:https://dotnetfiddle.net/7JQQ6I

抽象基类:

public abstract class Plugin
{
    public virtual string Output()
    {
        return "Default";
    }
}

使用默认实现的派生类,以及覆盖它的派生类:

public class BoringPlugin : Plugin 
{
    public override string Output()
    {
        return base.Output();
    }
}

public class ExcitingPlugin : Plugin
{
    public override string Output()
    {
        return "No boring defaults here!";
    }
}

测试结果:

public static void Main()
{
    var boring = new BoringPlugin();
    Console.WriteLine(boring.Output());

    var exciting = new ExcitingPlugin();
    Console.WriteLine(exciting.Output());
}
  

默认

     

这里没有无聊的默认值!