2009-11-20 2 views
5
public abstract class A 
{ 
    public abstract void Process(); 
} 

public abstract class B : A 
{ 
    public abstract override void Process(); 
} 

public class C : B 
{ 
    public override void Process() 
    { 
     Console.WriteLine("abc"); 
    } 
} 

Этот код генерирует ошибку компиляции: «B» не реализует унаследованный абстрактный член «A.Process()».Абстрактный метод переопределяет абстрактный метод

Есть ли способ сделать это?

+0

Зачем вам это нужно? –

+0

Что именно вы пытаетесь сделать? Ваш код не имеет большого смысла ... –

ответ

13

Просто оставьте метод полностью в классе B. B наследует его в любом случае от A, а так как сам B является абстрактным, вам явно не нужно его реализовывать.

8

Работы для меня в VS2008; нет ошибок, никаких предупреждений. НО, нет никаких причин, чтобы иметь ставиться в B. Этот код эквивалентен:

public abstract class A 
{ 
    public abstract void Process(); 
} 

public abstract class B : A 
{ 
} 

public class C : B 
{ 
    public override void Process() 
    { 
     Console.WriteLine("abc"); 
    } 
} 
3

Alon -

Это не имеет никакого смысла. Прежде всего, это действительно компилирует штраф. Во-вторых, абстрактный метод, который вы объявили в A наследуется (еще реферата) в B. Таким образом, у вас нет необходимости объявлять процесс() в классе В.

- Марк

3

Место, где я Видно, что это иногда переопределяет не абстрактный метод с абстрактным методом. Например:

public abstract class SomeBaseType 
{ 
    /* Override the ToString method inherited from Object with an abstract 
    * method. Non-abstract types derived from SomeBaseType will have to provide 
    * their own implementation of ToString() to override Object.ToString(). 
    */ 
    public abstract override string ToString(); 
} 

public class SomeType : SomeBaseType 
{ 
    public override string ToString() 
    { 
     return "This type *must* implement an override of ToString()"; 
    } 
} 
+0

Думаю, я знаю, что вы имеете в виду, но ваш пример не отражает то, что вы говорите. По крайней мере, вы должны добавить класс SomeVeryBaseType с не абстрактным виртуальным методом и позволить SomeBaseType наследовать от SomVeryBaseType. –

+0

Для тех манекенов, которые не знают или получают это ... вроде меня –

+0

@Lieven: Я добавил комментарий, чтобы было ясно, что базовый метод переопределяется здесь: 'Object.ToString()'. –

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

  • Нет связанных вопросов^_^