2014-11-12 2 views
0

Я знаю, что ответ, вероятно, нет, но все равно хотел бы подтвердить.
Может ли интерфейс иметь имя переменной метода? что-то вродеМожет ли интерфейс иметь имя шаблонного метода?

Interface IVariableMethodName //something similar to <T> 
{ 
    void T(int param); 
    void T(string param); 
} 

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

Отредактировано: пример

class Adder 
{ 
    public int Add(int a, int b){} 
    public float Add(float a, float b){} 
    public decimal Add(decimal a, decimal b){} 
} 


class Subber 
{ 
    public int Sub(int a, int b){} 
    public float Sub(float a, float b){} 
    public decimal Sub(decimal a, decimal b){} 
} 

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

+0

Как бы вы это реализовали? 'class MyClass: T'?! – mihai

+0

@ Mihai well idk, если intellisence достаточно умен, чтобы делать такую ​​вещь .... но похоже, что это не так сложно, чтобы компилятор понял. – Steve

+0

Как насчет делегатов? То же подписи разных реализаций ... – BionicCode

ответ

0

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

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

Например:

interface IOperator 
{ 
    int Operation(int a, int b); 
    float Operation(float a, float b); 
    decimal Operation(decimal a, decimal b); 
} 

class Adder : IOperator 
{ 
    public int Add(int a, int b){} 
    public float Add(float a, float b){} 
    public decimal Add(decimal a, decimal b){} 

    public int Operation(int a, int b) { return Add(a, b); } 
    public float Operation(float a, float b) { return Add(a, b); } 
    public decimal Operation(decimal a, decimal b) { return Add(a, b); } 
} 


class Subber : IOperator 
{ 
    public int Sub(int a, int b){} 
    public float Sub(float a, float b){} 
    public decimal Sub(decimal a, decimal b){} 

    public int Operation(int a, int b) { return Sub(a, b); } 
    public float Operation(float a, float b) { return Sub(a, b); } 
    public decimal Operation(decimal a, decimal b) { return Sub(a, b); } 
} 

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

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

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

+0

thx для ввода. Но методы будут иметь совсем другую функциональность. Поэтому их нелегко обобщить. В некоторых классах может быть даже более 1 набора этих перегрузок. И я действительно не хочу иметь один набор дублированных методов только для решения этой проблемы. – Steve

+0

Вы сказали, что методы всегда имеют одну и ту же подпись, поэтому они явно связаны каким-то образом. Ваш вопрос конкретно связан с обработкой этих групп методов, как если бы они были похожи в некотором роде, иначе почему бы им утверждать, что все они реализованы каждым классом? Кроме того, если какой-либо класс может иметь более одного набора перегрузок, то как в мире вы ожидаете, что один интерфейс поймает, выполнил ли этот класс полный набор дважды? Это не похоже на то, что класс может реализовывать интерфейс более одного раза. –

+0

не пробовал, но я ожидаю, что вы сможете реализовать что-то вроде IComparable , IComparable . Поправьте меня если я ошибаюсь. О связанном в некотором роде ... его все еще уродливо, чтобы увидеть два метода, делающих то же самое с одним и тем же параметром, но с другим именем. – Steve

Смежные вопросы