在C#中可以做类似这样的事情
public absctract class ImportBase()
{
public abstract void CreateDocument();
}
public class UsingOne : ImportBase
{
public override bool CreateDocument(string name)
{
return null;
}
}
我想要一些Base类,它只有一些方法,但在派生类中我需要更改输入参数和方法内部。
答案 0 :(得分:4)
你没有覆盖这个方法。拥有抽象(或虚拟)方法的重点是给定任何ImportBase
,我应该可以调用
importBase.CreateDocument();
显然不 UsingOne
的情况,因为它需要更多信息。所以你真的试图将你的来电者与UsingOne
联系起来,而不仅仅是ImportBase
- 此时你已经失去了多态性的好处。
要覆盖方法,实现必须具有相同的签名,基本上。
答案 1 :(得分:2)
您可能希望最小化派生类上的重复代码。基本上,不可能覆盖不同的签名,但是你可以重构代码,你可以在基类中保留可能的重复代码并在派生类上使用它。
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)
答案 2 :(得分:1)
没了。签名在派生类上必须相同。我建议使用构建器模式。