2015-07-28 2 views
1

У меня есть абстрактный базовый класс:Расширение иерархии классов

public abstract class BaseClass 
{ 
    public double CommonMethodForAllSubClasses(double parameter) 
    { 
     //common implementation 
     return 0; 
    } 

    public abstract double MethodThatMustBeDefinedInSubClasses(double parameter); 
} 

И иерархия классов под ним.

Я хочу сделать в другой сборке класс расширения для класса Base и его подклассов. Я думал сделать это со статическим классом с методами, которые получают в качестве параметра:

public static Method(this BaseClass, ...) 

Но я хочу, чтобы это статический метод, чтобы определить для всех подклассов от BaseClass. Я знаю, что не могу выполнять статический абстрактный метод, но я хочу избежать реализации этих методов в самом классе ... И было бы очень хорошо, что компилятор «говорит мне», что эти методы должны быть переопределены для подклассов ,

+0

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

ответ

1

Но я хочу, чтобы этот статический метод был определен для всех подклассов из BaseClass.

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

И было бы очень хорошо, что компилятор «говорит мне», что эти методы должны быть переопределены для подклассов.

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

+0

После нескольких дней исследования я согласен с вами ... Его питти, что C# не предлагает его каким-то образом. Поэтому я мог бы расширить базовую архитектуру и убедиться, что каждый класс должен быть определен в этих расширениях. – Fleve

1

Это то, что вы хотите?

public abstract class BaseClass 
{ 
    protected abstract void MethodThatMustBeDefinedInSubClasses(); 
} 

public class ChildClass : BaseClass 
{ 
    protected override void MethodThatMustBeDefinedInSubClasses() 
    { 
     Console.WriteLine("Do"); 
    } 
} 

public static class BaseClassExtensions 
{ 
    public static void DoExtension(this BaseClass foo) { } 

    public static void DoExtension(this ChildClass bar) {} 
} 

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

О компиляторе, рассказывающем вам о методе расширения, я думаю, что это невозможно, потому что метод расширения - это просто «синтаксический сахар». Метод расширения может быть использован, как это:

var foo = new BaseClass(); 
foo.DoExtension(); 

Но на самом деле это так же, как обычный статический класс:

var foo = new BaseClass(); 
BaseClassExtensions.DoSomething(foo); 

и компилятор не может предупреждаю вас, что вы должны сделать статический класс с методом, который должен принимать определенный тип.

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