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

ali*_*hoo 2 c# overriding partial

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

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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我添加另一个名为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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ada*_*son 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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 确实.部分类是C#语言的一个特性,而不是.Net平台的特性,因此一旦将某些内容编译为IL,您将无法再使用分部类. (2认同)