如何在接口中包装对象
本文关键字:包装 对象 接口 | 更新日期: 2023-09-27 18:18:37
我有一个接口
public interface ICallFlowApplication
{
void HandleCall();
}
和实现
public class TestCallFlowApplication : ICallFlowApplication
{
public void HandleCall()
{
// blah blah
现在由于某种原因,我需要传递一个对象给方法,所以
public void HandleCall(SipChannel channel)
{
我认为我必须重构接口ICallFlowApplication
public interface ICallFlowApplication
{
void HandleCall(SipChannel channel);
}
但是SipChannel是一个特殊的通道。有不同的渠道。我想在这里使用依赖注入。我的问题:
- 如何重写我的接口
ICallFlowApplication
? - 是否需要新建接口,如
IChannel
? - 如果有,有哪些细节?(示例代码)
使用泛型-
public interface ICallFlowApplication<T> where T : IChannel
{
void HandleCall(T channel);
}
public class TestCallFlowApplication : ICallFlowApplication<SipChannel>
{
public void HandleCall(SipChannel channel){}
}
public class SipChannel : IChannel {}
public interface IChannel {}
下面是一个在你自己的对象中包装SipChannel并继承channel的例子——
public interface ICallFlowApplication<T> where T : IChannel
{
void HandleCall(T channel);
}
public class TestCallFlowApplication : ICallFlowApplication<MySipChannel>
{
public void HandleCall(MySipChannel channel){}
}
public class MySipChannel : IChannel
{
private SipChannel _channel;
public MySipChannel(SipChannel channel)
{
_channel = channel;
}
// expose methods/properties you need
}
public interface IChannel {}
public class SipChannel {} // declared in some unknown dll
这里有一种方法,它可能适合也可能不适合您的需要。
正如Tom a所说,最好的办法是创建一个IChannel
接口,并将其封装在第三方提供的通道上。如果您必须对这些通道做一些事情,您可以在您的接口中指定它,并根据每个供应商的具体情况分别为每个通道实现它。
public interface IChannel
{
void DoSomething();
string DoSomethingElse();
}
public class SipChannel : IChannel
{
public void DoSomething()
{
//go do some stuff
}
public string DoSomethingElse()
{
return "I did some stuff for you.";
}
}
public OtherChannel : IChannel
{
public void DoSomething()
{
//go do some stuff
}
public string DoSomethingElse()
{
return "I'm not sure what this one does yet.";
}
}
现在,HandleCall
可以有签名:void HandleCall(IChannel channel);
并实现如下:
public void HandleCall(IChannel channel)
{
channel.DoSomething();
channel.DoSomethingElse();
}
,它将调用传入的特定实例的实现。