这是使用继承的正确方式吗
本文关键字:方式吗 继承 | 更新日期: 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
方法中的行为仍应被视为"正确"。
我不能谈论你的程序的逻辑,也不清楚你打算让这些插件做什么,但希望这能帮助你准确地弄清楚你想做什么,以及如何做。