根据需要创建一个包含子类的类,该子类可以是不同的类

时间:2018-03-26 14:52:43

标签: c# class subclass

我不确定如何实现这个特定的想法我有一个类让我们称之为EnhancedUserInput,它将包含一些所有输入类型将具有的变量和一个特定的子类,这取决于操作期间的需要所以一些额外的变量和一个列表,例如它的子类将是MultipleChoice,它将具有MinSelection,MaxSelection和一个名为option的类型列表及其自己的变量ect,然后是另一个可能的子类,名为ExplicitAgreement,它具有变量inputLabel1,inputLabel2和BinaryInput类型的列表,它有自己的变量。

到目前为止,据我所知,最好的方法是使用某种类型的通用变量?我将展示一些代码来尝试并帮助获得我需要的东西,但只是想知道是否有一种简单的方法可以做到这一点我不知道?

public class EnhancedCustomerInput
{
    public string Title { get; set;}

    public bool ResponseOptional { get; set;}

    public string CancelLabel { get; set;}

    public string SubmitLabel { get; set}

    // this is where I am unsure of how to go about it
    public object inputType
    {
        MultipleChoice
        ExplicitAgreement
    }
}

public class MultipleChoice
{
    public List<MultipleChoiceOption> Options { get; set; }

    public int MinSelected { get; set; }

    public int MaxSelected { get; set; }

}

public class ExplicitAgreement
{
    public List<BinaryInputOption> Buttons { get; set; }

    public string InputLabel1 { get; set; }

    public string InputLabel2 { get; set; }
}

这个解决方案的最佳途径是什么?我可以想到一些可能的方法,但它们会有点无形,并且想知道是否有任何简单的方法?

2 个答案:

答案 0 :(得分:4)

对我来说,你可能有错误的方法。也许你想要的只是使用类继承?

public class EnhancedCustomerInput
{
    public string Title { get; set;}
    public bool ResponseOptional { get; set;}
    public string CancelLabel { get; set;}
    public string SubmitLabel { get; set}
}

public class MultipleChoice : EnhancedCustomerInput
{
    public List<MultipleChoiceOption> Options { get; set; }
    public int MinSelected { get; set; }
    public int MaxSelected { get; set; }
}

public class ExplicitAgreement : EnhancedCustomerInput
{
    public List<BinaryInputOption> Buttons { get; set; }
    public string InputLabel1 { get; set; }
    public string InputLabel2 { get; set; }
}

答案 1 :(得分:2)

史蒂夫哈里斯的遗产建议很好。您使用Composition的原始选项也可以正常工作:

public class EnhancedCustomerInput
{
    public string Title { get; set;}

    public bool ResponseOptional { get; set;}

    public string CancelLabel { get; set;}

    public string SubmitLabel { get; set; }

    public object InputData { get; set; }
}

唯一的问题是代码的消费者需要知道InputData可以是几种不同类型之一,并且您可能需要switch类型的逻辑。您可以向属性添加注释以向人们提供提示,或者您可以使用像LanguageExt这样的库,它提供Either类型:

public class EnhancedCustomerInput
{
    public string Title { get; set;}

    public bool ResponseOptional { get; set;}

    public string CancelLabel { get; set;}

    public string SubmitLabel { get; set; }

    public Either<MultipleChoice, ExplicitAgreement> InputData { get; set; }
}

这使得InputData类型更加明显,但如果你有两种以上的可能性,它会变得非常笨拙。

您还可以声明InputData必须实现的接口,这将使开发人员更容易找到所有要在那里使用的类型。但是一个空接口被认为是一种代码味道,因为它表明你正在使用接口来实现它们并不是真正的用途。

我发现效果良好的另一个选项是定义enum类型,以帮助识别您可以拥有哪些不同类型的输入数据:

public class EnhancedCustomerInput
{
    public string Title { get; set;}

    public bool ResponseOptional { get; set;}

    public string CancelLabel { get; set;}

    public string SubmitLabel { get; set; }

    public InputType InputType { get; set; }

    public object InputData { get; set; }
}

public enum InputType { MultipleChoice, ExplicitAgreement }

这为您的业务逻辑提供了一组特定的可能类型,您可以switch使用您的逻辑,并且在类序列化和反序列化时特别有效,因为这样您就可以告诉解串器哪个具体要将InputData反序列化为。

的对象类型

有很多选择,每种选择各有利弊。