继承 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()
,但不应是必需的。有什么办法可以做到这一点吗?
当你需要从 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
它们。
请注意,您不需要重新声明 Edit
、 New
和 Delete
- 它们已经被 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 */ }
}