如果不允许这些类型的问题,我很抱歉。
我有类似于插件的简单基础。 这是我的例子
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函数,还是需要为它创建一个接口?
答案 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());
}
默认
这里没有无聊的默认值!