重写抽象方法(包括输入参数)

本文关键字:参数 输入 包括 抽象方法 重写 | 更新日期: 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