Как ссылаться на реализующий класс из интерфейса? - PullRequest
1 голос
/ 20 ноября 2011

Я создаю интерфейс, где мне нужен метод для ссылки на экземпляр класса, который реализует интерфейс. Вот пример:

class MyClass : IMyInterface{
    public void MyMethod(MyClass a){...} //implemented from the interface.
}

Так как же мне реализовать свой интерфейс (без обобщений) для ссылки на класс, в котором он реализован?

interface IMyInterface{
    void MyMethod(??? a);
}

Что должно прийти к ??? части?

Спасибо, Может.

Ответы [ 2 ]

9 голосов
/ 20 ноября 2011

Система типов C # не достаточно сложна, чтобы хорошо представлять понятие «я».ИМО, идеальное решение состоит в том, чтобы отказаться от этой цели и зависеть только от типа интерфейса:

interface IMyInterface
{
    void MyMethod(IMyInterface a);
}

Если этого недостаточно, это часто говорит о том, что интерфейс плохо указан;Вы должны вернуться к чертежной доске и по возможности найти альтернативный дизайн.

Но если вам все еще действительно нужно, вы можете использовать (своего рода) версию C # CRTP :

interface IMyInterface<TSelf> where TSelf : IMyInterface<TSelf>
{
    void MyMethod(TSelf a);
}

, а затем:

class MyClass : IMyInterface<MyClass>
{
    public void MyMethod(MyClass a) {...}  //implemented from the interface.
}

Обратите внимание, что это не совсем «безопасное» решение;ничто не мешает злой реализации использовать другой аргумент типа:

class EvilClass : IMyInterface<MyClass>  // TSelf isn't the implementing type anymore...
{
    public void MyMethod(MyClass a) {...}  // Evil...
}

, который работает против вашей цели.

0 голосов
/ 20 ноября 2011

Просто используйте IMyInterface вместо MyClass.Он сможет принимать все, что происходит от этого интерфейса и использует его.Если вы не хотите этого по какой-либо причине, все равно сделайте это, но добавьте в интерфейс какую-нибудь другую «проверку», что-то вроде public bool IsValidParam() или что-то еще.В общем, я бы рассмотрел что-то вроде этого плохого дизайна (интерфейсы не должны зависеть от какой-либо реализации этого фактического интерфейса, кроме как в самом интерфейсе).

...