我应该使用多个构造函数还是接口?

时间:2015-09-28 08:48:01

标签: c# constructor interface

我有一个名为Package的类,在这个类中我有大约10个属性,让我们称它们为1,2,3,4 ..等等。这些属性的类型是stringsints和一些DateTimes。有时我只需要属性1,有时我需要5,6和9,有时我需要3和10等等。

仅举两个例子:new Package("bla", "bla bla",100)new Package(2983)

read

  

接口看起来像一个类,但没有实现。唯一的   它包含的事件是事件,索引器,方法和/或的声明   属性。接口仅提供声明的原因是因为   它们是由类和结构继承的,它们必须提供一个   声明的每个接口成员的实现。

由于类中没有其他方法,只有构造函数和属性,使用20个构造函数更好,还是应该为这种情况创建一个接口?

修改 我应该提到我也有一些enums来'确定'Package是什么类型。

3 个答案:

答案 0 :(得分:3)

界面在这里没有任何帮助。

如果你想强制特定变量一起填充,比如1,2和3应该总是填充在一起,但在另一种情况下只需4就足够了,你可以使用单独的构造函数,或者使用有用的名称创建静态方法对象(如CreateFromIdCreateFromNameAndAge)。

如果你根本不关心,你可以简单地创建一个无参数构造函数(或带有可选字段的构造函数)并设置对象初始值设定项所需的字段:

var x = new Class() { Field1 = 1, Field2 = "2" };

也许这是一个标志,你在一个对象中做得太多,但如果没有关于你的课堂设计的实际信息,我们就无法说出那么多。

如果包具有不同的用途(例如ProductPackagePersonPackage等),继承似乎也是一个不错的解决方案。共享属性驻留在基类中,所有特定属性都可以驻留在派生类中。

答案 1 :(得分:0)

构造函数提供有关如何创建对象的指南。假设通过使用接口意味着指定需要存在的属性,您没有给出关于如何初始化属性的任何指导。

拥有多个构造函数应该更好,因为您提供了用户可以实例化对象的方法。这将允许您相应地初始化其他参数。

如果您需要规定哪些字段需要存在,您仍然可以使用界面。

答案 2 :(得分:0)

除了以上几点,请考虑使用Builder模式 - https://en.wikipedia.org/wiki/Builder_pattern

以下是示例:

class Package
{
    public string Name { get; set; }
    public string Description { get; set; }
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }

    public static PackageBuilder Create()
    {
        return  new PackageBuilder(new Package());
    }
}

class PackageBuilder
{
    private readonly Package _package;

    public PackageBuilder(Package package)
    {
        _package = package;
    }

    public PackageBuilder WithName(string name)
    {
        _package.Name = name;
        return this;
    }

    public PackageBuilder WithDescription(string description)
    {
        _package.Description = description;
        return this;
    }

    public PackageBuilder Prop1(string prop)
    {
        _package.Prop1 = prop;
        return this;
    }

    public PackageBuilder Prop2(string prop)
    {
        _package.Prop2 = prop;
        return this;
    }

    public static implicit operator Package(PackageBuilder pb)
    {
        return pb._package;
    }
}

class Client
{
    Package BuildPackage()
    {
        var package =
            Package.Create().WithName("My Package").WithDescription("Description").Prop1("foo").Prop2("bar");
        return package;
    }
}