在c#中继承类

时间:2013-01-23 13:43:52

标签: c# inheritance

我有一个抽象类和两个派生这个主要类的类:

abstract class MainClass
{
    public void DoSomething() {
        if(isEdit())
            Edit();
        else if(isNew())
            New();
        else if(isDelete())
            Delete();
        else if(isSearch())
            Search();
        else if(isExit())
            Exit();
    }

    public abstract void Edit();
    public abstract void New();
    public abstract void Delete();
    public abstract void Search();
    public abstract void Exit();
}

abstract class FirstClass : MainClass
{
    public abstract void Edit();
    public abstract void New();
    public abstract void Delete();
}


abstract class SecondClass : MainClass
{
    public abstract void Search();
    public abstract void Exit();
}

当您需要从FirstClass Edit()进行扩展时,必须声明New()Delete(),并且可以声明方法Search()Exit()但不应该是强制性的。有没有办法做到这一点?

5 个答案:

答案 0 :(得分:3)

  

当您需要从FirstClass Edit()扩展时,必须声明New()和Delete(),并且可以声明方法Search()和Exit(),但不应该是必需的。

这是可能的:

abstract class FirstClass : MainClass
{
    //public abstract void Edit();
    //public abstract void New();
    //public abstract void Delete();

    public override void Search()  { }
    public override void Exit()    { }
}

在MainClass中已经将Edit(),New()和Delete()声明为abstract(必须覆盖),因此FirstClass应该不管它们。

答案 1 :(得分:2)

将可选方法实现为override s:

abstract class FirstClass : MainClass
{
    public override void Search(){}
    public override void Exit(){}
}

由于它们在MainClass实现,因此您无需在任何继承类中实现,但如果您想要,则可以{{ 3}}他们。

请注意,您无需再次重新声明EditNewDelete - 它们已由FirstClass继承,并且需要由任何非它的抽象继承者。

答案 2 :(得分:0)

您可以覆盖MainClass中已声明的非强制性方法,FirstClassabstract class FirstClass : MainClass { public override void Search(){} public override void Exit() {} } 的基类,并为其提供默认功能:

FirstClass

强制方法不应在MainClass中声明,因为它们已在FirstClass中声明为抽象。它们在{{1}}

中仍然是抽象的

答案 3 :(得分:0)

覆盖可以在子类中声明的方法(其他方法将从MainClass继承并保持抽象):

abstract class FirstClass : MainClass
{  
    public override void Search() { /* default implementation */ }
    public override void Exit() { /* default implementation */  }
}

然后

class ThirdClass : FirstClass
{ 
    // Must implement abstract methods
    public override void Edit() { }
    public override void New() { }
    public override void Delete() { }

    // Optionally override 
    public override void Exit() { /* custom implementation */  }
}

答案 4 :(得分:0)

abstract关键字表示方法必须由继承类实现。 virtual关键字表示它可以实现。

将Save()和Exit()标记为虚拟,并提供它们的默认(可能为空)实现。