2015-11-25 2 views
0

У меня есть базовый класс (А) ниже, что я всегда хочу, унаследованных отКак ссылаться абстрактный метод из реализованного класса в C#

class A 
{ 
    abstract protected int foo(); 

    public int foo2() 
    { 
     //do some stuff 

     foo();  
    } 

} 

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

классы, которые наследуют класс A, будут иметь foo2 уже реализованы, но классы, которые наследуют, ДОЛЖНЫ реализовать foo? Также было бы предпочтительнее, чтобы foo2 был надёжным.

Update: Класс А не должен быть неабстрактными

+4

Почему не может быть абстрактным? Сделайте абстракцию и добавьте «virtual» в foo. – Jaster

+0

FYI: принцип чистого кода: поддержка композиции над наследованием –

+0

Вы можете сделать 'foo()' a 'виртуальный метод' с реализацией по умолчанию или создать новый« интерфейс »с этим методом и сделать его« класс A »реализовать. Или просто сделайте 'class A'' абстрактным классом'. – W0lfw00ds

ответ

2

Просто сделать класс A реферата. Абстрактные классы могут иметь некоторые методы.

Сделайте foo2() виртуальным, тогда классы, полученные от A, могут переопределить его.

+0

Виртуальный действительно нужен? Необходимость в этом мало напоминает смысл, который наследует _must_. Сделать виртуальным должен быть выбор прямых конкретных наследников. – Machinarius

+0

@Machinarius 'virtual' для' foo2' - тот, который уже реализован в 'A'. Это было вторым требованием - «Было бы также желательно, чтобы foo2 был надёжным». –

0

вы получите ошибки при создании проекта вы не можете определить абстрактный метод в неабстрактном классе

Исключение

Error 1 ' .A.foo()' is abstract but it is contained in non-abstract class 
1

Я надеюсь, что у вас есть веская причина, чтобы не сделать A Абстрактные. Предпочтительный способ изменить поведение существующего не абстрактного класса - это inject.

interface IFoo 
{ 
    int Foo(); 
} 

class A 
{ 
    private IFoo foo; 

    public A(IFoo foo) 
    { 
     this.foo = foo; 
    } 

    public int Foo2() 
    { 
     //... 
     return foo.Foo();    
    } 
} 
Смежные вопросы