我有一个抽象类和两个派生这个主要类的类:
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()
但不应该是强制性的。有没有办法做到这一点?
答案 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}}他们。
请注意,您无需再次重新声明Edit
,New
和Delete
- 它们已由FirstClass
继承,并且需要由任何非它的抽象继承者。
答案 2 :(得分:0)
您可以覆盖MainClass
中已声明的非强制性方法,FirstClass
是abstract 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()标记为虚拟,并提供它们的默认(可能为空)实现。