我有一个名为Package
的类,在这个类中我有大约10个属性,让我们称它们为1,2,3,4 ..等等。这些属性的类型是strings
,ints
和一些DateTimes
。有时我只需要属性1,有时我需要5,6和9,有时我需要3和10等等。
仅举两个例子:new Package("bla", "bla bla",100)
或new Package(2983)
我read:
接口看起来像一个类,但没有实现。唯一的 它包含的事件是事件,索引器,方法和/或的声明 属性。接口仅提供声明的原因是因为 它们是由类和结构继承的,它们必须提供一个 声明的每个接口成员的实现。
由于类中没有其他方法,只有构造函数和属性,使用20个构造函数更好,还是应该为这种情况创建一个接口?
修改
我应该提到我也有一些enums
来'确定'Package
是什么类型。
答案 0 :(得分:3)
界面在这里没有任何帮助。
如果你想强制特定变量一起填充,比如1,2和3应该总是填充在一起,但在另一种情况下只需4就足够了,你可以使用单独的构造函数,或者使用有用的名称创建静态方法对象(如CreateFromId
,CreateFromNameAndAge
)。
如果你根本不关心,你可以简单地创建一个无参数构造函数(或带有可选字段的构造函数)并设置对象初始值设定项所需的字段:
var x = new Class() { Field1 = 1, Field2 = "2" };
也许这是一个标志,你在一个对象中做得太多,但如果没有关于你的课堂设计的实际信息,我们就无法说出那么多。
如果包具有不同的用途(例如ProductPackage
,PersonPackage
等),继承似乎也是一个不错的解决方案。共享属性驻留在基类中,所有特定属性都可以驻留在派生类中。
答案 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;
}
}