【发布时间】:2014-02-12 10:04:53
【问题描述】:
我的问题与this question 类似,不同之处在于我不想直接约束到派生类,而是想约束到该类的接口。
一些背景:我正在尝试创建一个类型安全的接口驱动框架来创建 SignalR 集线器代理,主要是为了如果集线器名称或其方法之一发生更改,我不必搜索一堆字符串解决问题;在那张纸条上,我的信号 r 客户端都是 dot net,所以不用担心 java 脚本。
所以如果我有这个基类:
public abstract class BaseClientProxy<T>
{
protected IHubProxy proxy;
protected void Invoke<TDto>(TDto dto)
{
proxy.Invoke(this.GetCallingMethod(), dto);
}
protected void Invoke()
{
proxy.Invoke(this.GetCallingtMethod());
}
protected BaseClientProxy(HubConnection conn)
{
proxy = conn.CreateHubProxy<T>();
}
}
还有一个集线器代理,例如:
public class FoobarServiceProxy : BaseClientProxy<IFoobarService>, IFoobarService
{
public FoobarServiceProxy(HubConnection conn) : base(conn)
{
}
public void Bar(BarDto bar)
{
proxy.Invoke(this.GetCurrentMethod(), bar);
}
...
}
我怎样才能消除为基类和派生类指定接口的需要? 我愿意对此进行一些重组,而且我还没有进入众所周知的兔子洞。
【问题讨论】:
-
我不认为您可以消除在这两个地方指定接口的需要,但是您可以通过向基类添加另一个类型参数来强制子类实现接口,例如
class BaseClientProxy<T, I> where T : BaseClientProxy<T, I>, I where I : class { ... }
标签: c# generics inheritance signalr