Есть ли способ перегрузить методы расширения в C #? - PullRequest
5 голосов
/ 24 мая 2009

У меня есть следующий образец модели:

public abstract class PARENTCLASS {...}
public class CHILD_A_CLASS : PARENTCLASS{...}
public static class EXTENSION{
  public static METHOD(this PARENTCLASS parent){...}
  public static METHOD(this CHILD_A_CLASS child) {...}
}

Нечто подобное выше, конечно, будет больше детских (и внучатых) классов, но я просто поставил один из них. Проблема в том, что когда я вызывал метод расширения следующим образом:

PARENTCLASS cc = new CHILD_A_CLASS();
cc.METHOD();

Он будет выполнять метод расширения PARENT вместо моего ожидаемого метода расширения CHILD. У кого-нибудь есть идеи, как это реализовать? (Я не собираюсь помещать сам МЕТОД в класс и позволять ему делать наследование, потому что хочу сохранить класс модели чистым и вдали от другой логики).

Ответы [ 2 ]

5 голосов
/ 24 мая 2009

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

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

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

public static class Extension {
  public static void Method(this ParentClass p) { 
    var c = p as ChildAClass;
    if ( c != null ) {
      Method(c);
    } else {
      // Do parentclass action
    }
  }
  public static void Method(this ChildAClass c) {
    ...
  }
}
1 голос
/ 24 мая 2009

К сожалению, я не думаю, что вы сможете получить то, что вы хотите здесь. Методы расширения являются статическими, а статические методы не могут быть виртуальными.

Вы можете обойти это с помощью чего-то вроде решения JaredPar.

Если ваша цель состоит в том, чтобы отделить вашу модель от какой-либо реализации, я предлагаю вам взглянуть на Pattern Bridge (GOF). «Отделение абстракции от реализации». Это может помочь отделить ваши проблемы и обеспечить чистоту класса вашей модели.

...