C#覆盖抽象方法(包括输入参数)

时间:2011-11-11 13:57:07

标签: c# class interface abstract-class

在C#中可以做类似这样的事情

public absctract class ImportBase()
{
   public abstract void CreateDocument();
}
public class UsingOne : ImportBase
{
   public override bool CreateDocument(string name)
   {
      return null;
   }
}

我想要一些Base类,它只有一些方法,但在派生类中我需要更改输入参数和方法内部。

3 个答案:

答案 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)

没了。签名在派生类上必须相同。我建议使用构建器模式。

http://en.wikipedia.org/wiki/Builder_pattern