将新成员添加到覆盖方法中使用的 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。现在,当您尝试将 TModelTContext 反序列化为 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 个名字,我只是从你的例子中(错误地)推断出它们。