Мой вопрос похож на this question с той разницей, что вместо того, чтобы ограничивать производный класс напрямую, я хотел бы ограничить интерфейс этого класса.Как ограничить общий тип абстрактного класса интерфейсом производного класса?
Некоторые из предпосылок: Я пытаюсь создать безопасную интерфейсную структуру для создания SignalR Hub Proxies, в основном для случая, если имя узла или один из его методов изменяется, мне не нужно искать через кучу строки для решения проблемы; на этой заметке мой клиент r-клиента - это все точки сети, поэтому не стоит беспокоиться о 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: BaseClientProxy , I где I: class {...}' –
Lee