将新成员添加到override方法中使用的类

时间:2015-10-23 14:11:17

标签: c# c#-4.0 visual-studio-2015 .net-4.5

我有一个我在覆盖方法中使用的类。

该类有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;
            }

        };
    }

3 个答案:

答案 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。现在,当您尝试将TModelTContext反序列化为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。抱歉接口/类名,我刚从你的例子中推断出它们(非常糟糕)。