我有一个我在覆盖方法中使用的类。
该类有3个成员,但我想在覆盖方法中添加第4个成员。
这就是我所拥有的。代码会产生错误,但我无法弄清楚如何修复它或者它是否可能。
我的机器类有3名成员
public class Machine
{
public String PrimarySysName { get; set; }
public String SysSerial { get; set; }
public String SecondarySysName { get; set; }
}
GetMachineDesign的抽象方法
protected abstract Object GetMachineDesign(TModel model, TContext context);
GetMachineDesign的覆盖方法(尝试添加成员PrimaryAssemblyLocation):
protected override Object GetMachineDesign(SubSystem model, Design context)
{
//add new member
public String PrimaryAssemblyLocation;
return new Machine
{
SecondarySysName = model.SecondarySysName,
SysSerial = model.SysSerial,
PrimarySysName = model.PrimarySysName
//set new member here
set {
PrimaryAssemblyLocation = context.Location;
}
};
}
答案 0 :(得分:1)
这是不可能的。
我建议你添加
public String PrimaryAssemblyLocation;
与GetMachineDesign方法在同一个班级
答案 1 :(得分:1)
不可能做这样的事情。如果您无法修改Machine
类,请将此成员添加到Machine
类或创建具有该附加成员的新派生类。
public class MyMachine : Machine
{
public string PrimaryAssemblyLocation { get; set; }
}
用法:
protected override Object GetMachineDesign(SubSystem model, Design context)
{
return new MyMachine
{
SecondarySysName = model.SecondarySysName,
SysSerial = model.SysSerial,
PrimarySysName = model.PrimarySysName
PrimaryAssemblyLocation = context.Location;
};
}
答案 2 :(得分:1)
目前您的设计的杀手是您的GetMachineDesign
方法返回Object
。现在,当您尝试将TModel
和TContext
反序列化为Machine
时,在GetMachineDesign
之间使用抽象的PrimaryAssemblyMachine
方法时,您将紧密耦合(称之为“猜测它实际上是什么”和你的方法,你也可以改变方法:
protected abstract PrimaryAssemblyMachine GetMachineDesign(TModel model, TContext context);
由于您的方法的用户不知道您的方法实际上返回了具有Machine
属性的PrimaryAssemblyLocation
。
我建议您将机器的基本属性提取到接口,并为具有新属性的每台机器实现其他接口。
所以定义你的机器如:
interface IMachine
{
String PrimarySysName { get; set; }
String SysSerial { get; set; }
String SecondarySysName { get; set; }
}
然后为您的机器设置另一个界面:
interface IPrimaryAssemblyMachine : IMachine
{
String PrimaryAssemblyLocation { get; set; }
}
然后,您现在可以将解串器的定义更改为:
protected abstract IMachine GetMachineDesign(TModel model, TContext context);
然后有一个重载(例如假设你已经构建了IPrimaryAssemblyMachine
的实现者):
internal class PrimaryAssemblyMachineBuilder : MachineBuilderBase
{
protected abstract IMachine GetMachineDesign(TModel mode, TContext context)
{
// Do some de-serialisation.
return new PrimaryAssemblyMachine(primarySysName,
sysSerial,
secondarySysName,
primaryAssemblyLocation);
}
}
现在这意味着您已从实现中删除了GetMachineDesign
的用户之间的耦合。现在,如果PrimaryAssemblyLocation
属性可用,您可以轻松做出决定,因为它仅适用于继承自IPrimaryAssemblyMachine
的类。
P.S。抱歉接口/类名,我刚从你的例子中推断出它们(非常糟糕)。