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