编译接口代理的时间检查

时间:2016-03-24 14:14:59

标签: c# class interface behavior

上下文

我有一个班级,它接受一个" 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类中添加行为,同时允许处理程序为空(不添加行为)。我之所以选择这种模式,但我只是在规划代码,所以改变那些能给我这套功能的东西都会很棒。

1 个答案:

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