继承 c# 中的类

本文关键字:继承 | 更新日期: 2023-09-27 17:55:32

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

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(),但不应是必需的。有什么办法可以做到这一点吗?

继承 c# 中的类

当你需要从 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 应该不理会它们。

override s 实现可选方法:

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

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

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

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

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

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

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

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

重写可以在子类中选择性声明的方法(其他方法将从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 */  }
}