将新成员添加到覆盖方法中使用的 class
Add new member to class used in override method
我有一个 class 用于替代方法。
class 有 3 个成员,但我想在覆盖方法中添加第 4 个成员。
这是我的资料。代码会产生错误,但我不知道如何修复它,甚至不知道它是否可能。
我的机器 class 有 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;
}
};
}
这是不可能的。
我建议你添加
public String PrimaryAssemblyLocation;
与您的 GetMachineDesign 方法相同class
不可能做这样的事情。如果您无法修改 Machine
class.[=14,请将此成员添加到 Machine
class 或创建一个具有该附加成员的新派生 class =]
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;
};
}
目前您的设计的杀手是您的 GetMachineDesign
方法 returns 和 Object
。现在,当您尝试将 TModel
和 TContext
反序列化为 Machine
时,您将在 PrimaryAssemblyMachine
之间使用抽象的 GetMachineDesign
方法时紧密耦合(称它为对它实际是什么的猜测)和你的方法,你也可以将方法更改为:
protected abstract PrimaryAssemblyMachine GetMachineDesign(TModel model, TContext context);
因为您的方法的用户不知道您的方法实际上 returns 一个 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。抱歉 interface/class 个名字,我只是从你的例子中(错误地)推断出它们。
我有一个 class 用于替代方法。
class 有 3 个成员,但我想在覆盖方法中添加第 4 个成员。
这是我的资料。代码会产生错误,但我不知道如何修复它,甚至不知道它是否可能。
我的机器 class 有 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;
}
};
}
这是不可能的。
我建议你添加
public String PrimaryAssemblyLocation;
与您的 GetMachineDesign 方法相同class
不可能做这样的事情。如果您无法修改 Machine
class.[=14,请将此成员添加到 Machine
class 或创建一个具有该附加成员的新派生 class =]
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;
};
}
目前您的设计的杀手是您的 GetMachineDesign
方法 returns 和 Object
。现在,当您尝试将 TModel
和 TContext
反序列化为 Machine
时,您将在 PrimaryAssemblyMachine
之间使用抽象的 GetMachineDesign
方法时紧密耦合(称它为对它实际是什么的猜测)和你的方法,你也可以将方法更改为:
protected abstract PrimaryAssemblyMachine GetMachineDesign(TModel model, TContext context);
因为您的方法的用户不知道您的方法实际上 returns 一个 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。抱歉 interface/class 个名字,我只是从你的例子中(错误地)推断出它们。