上下文
我有一个班级,它接受一个" Handler",就像这样:
interface IHandler
{
void DoSomething(MyType type, string s);
}
public class MyType
{
private IHandler handler;
public MyType(IHandler handler = null)
{
this.handler = handler;
}
public void DoSomething(string s)
{
handler?.DoSomething(this, s);
}
}
问题
我想确保IHandler
中的所有方法都在MyType
中实现,而没有第一个参数MyType type
,这将在{{1}的处理程序调用中填充}}
我的问题
是否有允许这样的事情的模式?我想过继承this
中的IHandler
,但这需要调用者在调用中指定类型,这会破坏目的。我也可以确保它们都被手动调用,但界面将变得非常庞大,并且可能有几个父接口。这是我的最后一招。如果需要,我真的不介意更改代码。
我的目标
我希望能够在MyType
类中添加行为,同时允许处理程序为空(不添加行为)。我之所以选择这种模式,但我只是在规划代码,所以改变那些能给我这套功能的东西都会很棒。
答案 0 :(得分:0)
为什么MyType
本身应该实现它不会继承的接口方法?如果您必须使用另一组方法添加IAnotherHandler
该怎么办?
MyType
看起来像是在不指定IHandler
的情况下调用MyType
方法的包装器。如果处理程序是由MyType
创建的,那么您可以将this
作为构造函数参数传递(为了保持封装,没有它,您只需创建一个属性来指定this
)
public class MyType
{
public IHandler Handler { get; }
public MyType() { }
public MyType(IHandlerFactory factory)
{
// create instance via factory
Handler = factory.CreateHandler(this);
}
}
现在你应该能够通过属性调用处理程序方法:
var test = new MyType(new ConcreteFactory()); // with handler
// var test = new MyType(); // without handler
test.Handler?.DoSomething("test"); // you will have to check for `null` always
在不修改大量代码的情况下,向MyType
添加更多处理程序或更多处理程序的方法应该很容易。
我会为处理程序使用基类:
abstract class Handler
{
MyType _type;
public Handler(MyType type)
{
Type = type;
}
public abstract void DoSomething(string s) { ... }
}
class ConcreteHandler: Handler
{
public override void DoSomething(string s) { ... }
}
interface IHandlerFactory
{
Handler CreateHandler(MyType type);
}
class ConcreteFactory: IHandlerFactory
{
public Handler CreateHandler(MyType type) => new ConcreteHandler(type);
}