2016-07-26 62 views
0

我想实现两个级别的继承。目前,有一个抽象类,继承的类:抽象和虚函数

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

public class B : A 
{ 
    public override void func() 
    { 
     ....... 
    } 
} 

我想创建B类的两个专门的实例,但我想这些功能由A类。我打算暴露,

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

public class B : A 
{ 
    public virtual void func(); 
} 

public class C : B 
{ 
    public override void func() 
    { 
     ........ 
    } 
} 

public class D : B 
{ 
    public override void func() 
    { 
     ........ 
    } 
} 

这个实现是错误的,但这是我的意图。我将如何实现这一点?

+0

应该''B类'有'func()'的实现吗? – Rotem

+0

实际上,B类并没有为func()实现一个实现。我会更新这个问题。 – sethu

+0

如果它没有实现并且没有提供'空'实现,那么'B类'也是抽象的(这很好,除非你需要能够创建一个具体的'B类')。 – Rotem

回答

2

您可以使用接口,而不是像这样的抽象类A:

public interface A 
{ 
    void func(); 
} 
public abstract class B: A 
{ 
    public abstract void func(); 
} 
public class C : B 
{ 
    public override void func() 
    { 
     throw new NotImplementedException(); 
    } 
} 
public class D : B 
{ 
    public override void func() 
    { 
     throw new NotImplementedException(); 
    } 
} 

可能会帮助你。

+1

你假设OP不想实例化和使用B类用于其他潜在的属性/方法。 – Ash

+0

@AshwinNair:我不能让你解释你的担忧吗? –

+0

我的意思是你假设OP不想使用:'var b = new B();' – Ash

2

你不能没有实现的虚方法,所以不是你应该做的类B抽象的,它应该让编译器高兴:

public abstract class B : A 
{ 
} 

替代方法是增加空方法体功能func

public class B : A 
{ 
    public virtual void func() 
    { 
     // function has empty method body 
     // it does not do anything, but you can override functionality in derived classes 
    } 
} 
+0

我添加了返回类型。我们可以覆盖重写的函数吗? – sethu

+2

@sethu是的,你可以。抽象,虚拟或重写的函数都可以在派生类中重写 – dotnetom

+0

如果我使用覆盖重写函数(类b具有公共覆盖void func())。在这种情况下,重写的函数(C和D中的函数)永远不会被调用。只有B类功能被触发。 – sethu