我需要在单独的程序集中部分定义一个类。实际上我需要部分重新定义一个类,这已经在用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()': 找不到合适的方法来覆盖
如果我删除了部分类行和多行,一切正常 我使用的是部分关键字的概念吗?我怎样才能摆脱错误?
答案 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)
是否可以从基类继承并为派生类创建中间基类?这样,您可以根据需要添加缺少的功能,并仍然保持类型依赖于原始基类。对于使用部分类扩展程序集边界的基类,即使它可以工作,我也会感到很自豪。