0

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

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()可以声明但不应该是强制性的。有没有办法做到这一点?

4

5 回答 5

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()    { }
}

Edit()、New() 和 Delete() 已经在 MainClass 中声明为抽象(必须覆盖),因此 FirstClass 应该不理会它们。

于 2013-01-23T13:47:23.467 回答
2

将可选方法实现为overrides:

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

由于它们是在 中实现MainClass,因此您不需要在任何继承类中实现,但如果您愿意,您可以使用override它们。

请注意,您不需要重新声明Edit,New并且Delete再次 - 它们已经被继承,FirstClass并且需要由它的任何非抽象继承者实现。

于 2013-01-23T13:46:15.640 回答
0

您可以覆盖已声明的非强制性方法,MainClass其中是 的基类FirstClass,并为其提供默认功能:

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

强制方法不应在 中声明FirstClass,因为它们已在MainClass. 它们仍然是抽象的FirstClass

于 2013-01-23T13:46:47.050 回答
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 */  }
}
于 2013-01-23T13:47:01.013 回答
0

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

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

于 2013-01-23T13:48:25.823 回答