2009-11-20 261 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

爲什麼你想要? – 2009-11-20 08:01:38

+0

你到底在做什麼?你的代碼沒有什麼意義...... – 2009-11-20 08:20:52

回答

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

阿龍 -

這是沒有意義的。首先,這實際上編譯得很好。其次,你在一個聲明的抽象方法是繼承(仍然摘要)爲B.因此,你沒有必要在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繼承。 – 2009-11-20 08:49:22

+0

對於那些不知道或者得到那些的傻瓜......像我一樣 – 2009-11-20 09:01:33

+0

@Lieven:我添加了一條評論來說明這裏被覆蓋的基本方法是Object.ToString()。 – 2009-11-20 09:08:49