C #: принудительный способ обозначения метода есть как часть интерфейса - PullRequest
2 голосов
/ 29 января 2010

Есть ли в C # способ пометить метод как часть класса для удовлетворения интерфейса, который реализует этот класс? Я иногда задаюсь вопросом, копаясь в коде класса, почему существуют некоторые методы, но затем, когда я пытаюсь удалить один, так как он не используется, я вижу, что класс должен реализовать какой-то интерфейс. Было бы хорошо, чтобы эти методы были помечены как таковые. Что-то вроде @Override аннотации в Java, может быть.

Редактировать: Я бы предпочел , а не явно реализовать интерфейс, потому что тогда доступ к методам интерфейса в экземпляре моего класса становится больше хлопот (т. Е. Необходимость приведения экземпляр MyClass должен быть IMyInterface до вызова MyInterfaceMethod).

Редактировать: Я бы также предпочел не использовать регионы. Я не хочу, чтобы большой блок кода описывался свободно через какое-то произвольное имя как часть реализации интерфейса, а скорее чтобы обозначать конкретные методы, где бы они ни находились в классе, как часть интерфейса. Даже некоторый шаблон комментария XML, предназначенный для указания, к какому интерфейсу принадлежит метод, было бы неплохо.

Редактировать: Все ответы, кажется, предполагают, что я явно реализую интерфейсы, что я не хочу делать, или что я использую регионы, что я тоже не хочу делать. Я думаю Уилл понял мою просьбу лучше всего. Я надеялся на что-то вроде аннотации, поэтому я мог сделать что-то вроде следующего:

[Interface(IMyInterface)]
public void MyImplicitlyImplementedInterfaceMethod() { }

Или, как dss539 упомянул в комментарии к этот ответ :

public implement void MyImplicitlyImplementedInterfaceMethod() { }

Так же, как у нас override сегодня: public override bool Equals(object obj) { }.

Ответы [ 9 ]

5 голосов
/ 29 января 2010

Окружите их #region MyInterface Members, как Visual Studio делает для вас.

Это снижает удобочитаемость, если вы используете #region только для членов интерфейса. С другой стороны, если вы используете его для личных переменных, свойств, методов, событий и различных элементов интерфейса, код станет намного более читабельным. Вы также можете группировать участников по функциональности.

Еще один вариант - использовать инструмент, который сделает это за вас. Например, вы можете использовать NArrange - .NET Code Organizer / Formatter / Beautifier

4 голосов
/ 29 января 2010

У вас есть три варианта:

Явно реализовать интерфейс:

Вы можете явно реализовать интерфейс , используя синтаксис IInterface.MethodName, например:

bool IInterface.MethodName(string other) 
{
    // code
}

Обернуть элементы интерфейса в регионе

Инструменты уже перенесут ваш код в регион, если вы выберете «Реализовать интерфейс» через пользовательский интерфейс:

#region IInterface members

public bool MethodName(string other)
{
    // code
}

#endregion

Документ с комментариями

C # позволяет добавлять несколько видов комментариев через //, /* или XML-комментарии к документации . Используйте свободно!

2 голосов
/ 29 января 2010

Возможно, у вас есть более глубокие проблемы с дизайном, если ваш класс реализует методы, которые, по вашему мнению, должны быть удалены.

В любом случае, Решарпер может помочь вам здесь.

http://www.jetbrains.com/resharper/documentation/presentation/overview/code_generation/Generate_demo.htm

Перетащите ползунок на 10/69, чтобы увидеть специальный значок «Интерфейс инструментов».

Resharper сообщает вам, для какого интерфейса требуется метод.

Редактировать: Кроме того, если вы наведите курсор мыши на имя метода, появится всплывающий текст, объясняющий, откуда появился этот метод. Я не уверен, является ли это частью Visual Studio или Resharper, так как я использовал Resharper так долго. Может кто-нибудь без установленного Resharper это подтвердить?

1 голос
/ 29 января 2010

Можете ли вы использовать надстройку для Visual Studio? Это избавит вас от разметки вашего кода способом, который не может быть проверен, но имеет недостаток в том, что вы не сможете получить информацию при просмотре кода вне Visual Studio.

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

ReSharper http://img686.imageshack.us/img686/5325/34804250.jpg

Я бы сказал, что CodeRush , вероятно, делает что-то подобное.

1 голос
/ 29 января 2010

Может быть, вы хотите развернуть свой собственный атрибут? - http://msdn.microsoft.com/en-us/library/sw480ze8(VS.80).aspx

Вы можете создать свой собственный атрибуты путем определения атрибута класс, класс, который наследуется напрямую или косвенно из атрибута, который делает идентифицирующий атрибут определения в метаданных быстро и просто. Предположим, вы хотите пометить классы и строит с именем программист, который написал класс или структура. Вы можете определить обычай Класс атрибута автора:

Пример из приведенного выше описания. Возможно, вы захотите, чтобы это применялось к методам и было похоже на @Override в Java.

[Author("H. Ackerman", version = 1.1)]
class SampleClass
{
    // H. Ackerman's code goes here...
}
1 голос
/ 29 января 2010

VB.NET поддерживает что-то подобное, но не C #.

0 голосов
/ 29 января 2010

Другой способ, если ваш анти-регион будет использовать комментарии к документации следующим образом:

///<summary>
/// Used for implementation of InterfaceX
///</summary>
public void Foo() {}
0 голосов
/ 29 января 2010
#region ISomeInterface implementation
public void Foo(){}
public void Bar(){}
#endregion
0 голосов
/ 29 января 2010

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

public Foo : IDisposable
{
    void IDisposable.Dispose()
    {
    }
}
...