这是使用继承的正确方式吗

本文关键字:方式吗 继承 | 更新日期: 2023-09-27 18:25:28

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

我有一个类似插件的简单基础。这是我的示例

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);
    }
}

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

其次,我可以强迫他们从分部类中实现Run函数吗?或者我需要为此创建一个接口吗?

这是使用继承的正确方式吗

通过将方法声明为virtual并在派生类中重写它,可以定义具有"默认"行为的abstract类。

派生类不必重写抽象基类中的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());
}

默认

这里没有无聊的默认设置!

这不是使用partial关键字的正确方法。partial关键字只允许您将类的定义扩展到多个源文件中。它不是用来描述程序体系结构的东西。您可以使用它将定义拆分为多个文件,类似于以下内容:

插入.cs

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

插入.cs

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

但这对你没有帮助,你应该忘记partial关键字(现在)。您似乎在与面向对象编程相关的概念作斗争。partial关键字与此无关,所以不用担心

如果希望"强制"从Plugin继承的类来实现Run方法,则应该使用抽象方法。但是,正如您在该链接中所读到的,如果您使用抽象方法,您将无法定义当前在run方法主体中定义的"默认"行为。

如果您希望从Plugin继承的类被强制定义ADDITIONAL行为,那么仅仅使用抽象类/方法/接口之类的概念是不容易做到这一点的。您会发现更容易折衷,并允许从插件继承的类"仅"具有Run方法的默认行为,如Plugin基类中所述。

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

我不能谈论你的程序的逻辑,也不清楚你打算让这些插件做什么,但希望这能帮助你准确地弄清楚你想做什么,以及如何做。