找不到合适的方法来覆盖部分类的错误

时间:2010-10-29 14:37:52

标签: c# override partial

我需要在单独的程序集中部分定义一个类。实际上我需要部分重新定义一个类,这已经在用C ++ Cli编写的程序集中定义,但这可能是一个不同的问题。
对于这种情况,所有用c#编写的代码,我都在basenamespace assembly

中有一个基类定义
using System;

namespace BaseNameSpace
{
  public class BaseClass
  {
    public int Num;
    public double dNum;
    public BaseClass(int s, double d)
    {
      Num = s;
      dNum = d;
    }

    public virtual void Wrt()
    {
      Console.WriteLine("{0},{1}", Num, dNum);
    }
  }
}

我添加另一个名为derivedclassSpace的程序集项目,并声明从baseclass派生的derivedclass。我还为这个项目添加了一个部分类定义。

using System;
using BaseNameSpace;

namespace BaseNameSpace
{
  public partial class BaseClass
  {
    public void Mult()
    {
      Num *= 2;
    }
  }
}

namespace DerivedNameSpace
{
  public class DerivedClass : BaseClass
  {
    public DerivedClass(int s)
      : base(s, 0)
    {

    }

    public override void Wrt()
    {

      Mult(); // mult line
      base.Wrt();
    }
  }
}

当我构建解决方案时,我得到了

  

'DerivedNameSpace.DerivedClass.Wrt()':   找不到合适的方法来覆盖

如果我删除了部分类行和多行,一切正常 我使用的是部分关键字的概念吗?我怎样才能摆脱错误?

2 个答案:

答案 0 :(得分:7)

您无法跨程序集定义分部类。部分类(和部分方法)只是编译器功能,允许您跨文件拆分定义。编译程序集后,就会有一个类。你唯一真正的选择是继承基类,添加你的函数,然后从这个新类继承更多的派生类。

但是,如果您要尝试的是将方法添加到现有类,则可以考虑使用扩展方法。虽然这实际上并没有将它添加到本身类中,但它确实允许您编写代码,就好像它一样。

namespace BaseNameSpace
{
  public static class BaseClassExtensions
  {
    public static void Mult(this BaseClass instance)
    {
      instance.Num *= 2;
    }
  }
}

namespace DerivedNameSpace
{
  public class DerivedClass : BaseClass
  {
    public DerivedClass(int s)
      : base(s, 0)
    {

    }

    public override void Wrt()
    {

      Mult(); // mult line
      base.Wrt();
    }
  }
}

答案 1 :(得分:0)

是否可以从基类继承并为派生类创建中间基类?这样,您可以根据需要添加缺少的功能,并仍然保持类型依赖于原始基类。对于使用部分类扩展程序集边界的基类,即使它可以工作,我也会感到很自豪。