重写抽象方法(包括输入参数)
本文关键字:参数 输入 包括 抽象方法 重写 | 更新日期: 2023-09-27 18:14:06
在c#中可以这样做
public absctract class ImportBase()
{
public abstract void CreateDocument();
}
public class UsingOne : ImportBase
{
public override bool CreateDocument(string name)
{
return null;
}
}
我想有一些基类,其中只有一些方法,但在派生类我需要改变输入参数和方法内部
您没有重写该方法。使用抽象(或虚拟)方法的意义在于,给定任何ImportBase
,我应该能够调用
importBase.CreateDocument();
显然不是 UsingOne
的情况,因为它需要更多的信息。因此,您实际上是在尝试将调用方绑定到UsingOne
,而不仅仅是ImportBase
——在这一点上,您已经失去了多态性的好处。
要覆盖一个方法,实现必须具有相同的签名,基本上。
可能您想尽量减少派生类上的重复代码。基本上,重写不同的签名是不可能的,但你肯定可以重构你的代码,在基类中保留可能的重复代码,并在派生类中使用它。
public absctract class ImportBase()
{
//Making this protected here
protected virtual void CreateDocument()
{
//Your CreateDocument code
};
}
public class UsingOne : ImportBase
{
private override void CreateDocument()
{
// Override this if you have different CreateDocument for your different
// for different derived class.
}
public bool CreateDocument(string name)
{
// Do whatever you need to do with name parameter.
base.CreateDocument();
// Do whatever you need to do with name parameter.
return true; // return false;
}
}
您可以创建UsingOne
的实例并调用CreateDocument(string name)
不。派生类上的签名必须相同。我建议使用builder模式。
http://en.wikipedia.org/wiki/Builder_pattern