2010-10-11 3 views
3

У меня есть общий интерфейс:Реализация универсального интерфейса

public interface IUnauthorizedRequestRespondable<out T> where T:class 
{ 
    T GetResponseForUnauthorizedRequest(); 
} 

(я не знаю, почему Resharper рекомендуется Т «из», но это не вопрос).
В моем случае объект, возвращаемый GetResponseForUnauthorizedRequest, всегда имеет тип, реализующий интерфейс.

Таким образом, все реализации этого интерфейса выглядит следующим образом:

public class SignInReturnedObject : IUnauthorizedRequestRespondable<SignInReturnedObject> 

(имя класса и типа в скобках всегда одинаковы).
Что кажется немного неудобным - нет ли более аккуратного способа сообщить компилятору, что метод интерфейса возвращает тип, в котором он входит?

Спасибо.

ответ

2

Если единственный способ, которым Вы хотите использовать этот шаблон в этой манере, я хотел бы использовать:

public interface IUnauthorizedRequestRespondable<T> where T:IUnauthorizedRequestRespondable<T> 
{ 
    T GetResponseForUnauthorizedRequest(); 
} 

Это имеет то преимущество, что гарантирует его не используется каким-либо другим способом.

Объявление класса не изменится, но я не вижу в этом ничего такого же неудобного. Учитывая, что вы определяете отношения между классом и самим собой, любая более сжатая форма может быть нецелесообразной.

4

Насколько я знаю, в C# нет способа сделать это в настоящее время.

теоретическая сторона нотная: функция, которая позволит вам сделать это называется типы самостоятельной но не доступен в C#. Идея функции является то, что у вас есть особый тип, который относится к фактическому типу this, поэтому если у вас есть специальный тип по имени self, вы могли бы написать что-то вроде:

public interface IUnauthorizedRequestRespondable { 
    self GetResponseForUnauthorizedRequest(); 
} 

... и фактический тип используется вместо self, когда у вас есть класс SignInReturnedObject реализующий интерфейс будет SignInReturnedObject, но к сожалению, это не
доступны в C# :-)

0

на самом деле, что о резюмирует это. Вот как работает синтаксис.

Вы можете видеть, что он используется в самой .NET с помощью inteface IEquatable - вы почти всегда сравниваете объект с самим собой, но вам всегда нужно предоставить свое собственное имя класса в качестве параметра шаблона.

Это просто обеспечить гибкость, чтобы вы могли сравнивать что угодно, не обязательно самостоятельно.

0

Вы можете создать необщую версию и просто использовать это, но я думаю, что это больше проблем, чем она стоит

public interface ICastUnauthorizedRequestRespondable : IUnauthorizedRequestRespondable<SignInReturnedObject> 
{ 
} 
0

С Т может быть любым класса (не должна быть класс вы реализуете) вам нужно назвать свой класс.

public class SignInReturnedObject : IUnauthorizedRequestRespondable<ANYCLASS> 
Смежные вопросы