2016-11-30 7 views
0

У меня есть 4 следующие классы:CS0534 Ошибка - не реализует унаследованный абстрактный член

public abstract class Base 
{ 
    abstract public void DoIt(); 
} 

public class TW: Base {} 
public class RW: TW 
{ 
    public override void DoIt() {} 
} 
public class IW: TW 
{ 
    public override void DoIt() {} 
} 

Использование:

var transaction = new TW(); 
transaction.DoIt(); 

Я не ясно, почему я получаю следующее сообщение об ошибке:

Error CS0534 'TW' does not implement inherited abstract member 'Base.DoIt()'

Если все производные классы «листья» (RW и IW) переопределяют его, почему также (TW) необходимо переопределить его? Я могу что-то потерять, потому что помню, что это было не обязательно. Я не хочу переопределять его в TW, так как у меня нет правильной реализации, чтобы писать там.

я ожидал, чтобы иметь возможность написать что-то вроде:

public override abstract void DoIt(); 

Что такое правильное выполнение?

UPDATE:

Согласно ответам, которые я получил, и из-за некоторых ограничений, мне придется реализовать его следующим образом:

public override void DoIt() 
{ 
    //Not getting to this code, it is overriden by the derived classes 
} 

Это приемлемо? Я чувствую, что, возможно, что-то в архитектуре ошибочно, если я попаду в такую ​​ситуацию.

+2

Что вы ожидаете от 'нового TW(). DoIt()' делать? Абсолютно * есть требование, чтобы конкретный подкласс обеспечивал отсутствие оставшихся абстрактных членов. Возможно, вы хотите, чтобы «TW» также был абстрактным? (Это не помогает, чтобы ваш код не указывал никаких модификаторов доступа. Пожалуйста, исправьте сообщение, чтобы ошибка * только * была той, которая вам интересна.) –

+0

На самом деле ничего. Только производные классы будут выполнять задания – ehh

+0

Класс tw muste также абстрактный или должен реализовать DoIt, иначе вы получите сообщение об ошибке. – ascholz

ответ

1

Если вы не хотите, чтобы TW был абстрактным классом, но вы не хотите предлагать «реальную» реализацию DoIt, то вам следует выбросить исключение в DoIt вместо возврата.

public override void DoIt() 
{ 
    throw new NotSupportedException(
     "The DoIt() method was called on a class which does not support that method."); 
} 
4

Вы также должны сделать TW абстрактным классом.

public abstract class Base 
{ 
    public abstract void DoIt(); 
} 

public abstract class TW: Base {} 

public class RW: TW 
{ 
    public override void DoIt() {} 
} 

public class IW: TW 
{ 
    public override void DoIt() {} 
} 
+0

Я не могу сделать его абстрактным, так как я создаю его. – ehh

+0

Итак, реализуйте DoIt() на TW –

+0

Тогда у вас нет выбора: Внедрить DoIt. – Frank

1

Поскольку вы изменяли вопрос: Вот новый ответ ...

var transaction = new TW(); 
transaction.DoIt(); // compiler error because this method does not really exist. 

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