我有一个名为Package
的类,在这个类中,我有大约10个属性,让我们称之为1,2,3,4。这些属性的类型是strings
、ints
和一些DateTimes
。在创建包的新对象时,有时只需要属性1,有时需要5、6和9,有时需要3和10等等。
所以只有两个例子:new Package("bla", "bla bla",100)
或new Package(2983)
我有朗读:
接口看起来像类,但没有实现。它所包含的唯一内容是事件、索引器、方法和/或属性的声明。接口只提供声明的原因是它们是由类和结构继承的,它们必须为声明的每个接口成员提供一个实现。
由于类中没有其他方法,只有构造函数和属性,所以最好使用20个构造函数,还是应该为这种情况创建一个接口?
编辑:--我可能应该提到,我也有一些enums
来“某种”确定它是哪种Package
。
发布于 2015-09-28 00:53:12
在这里,界面对你没有任何帮助。
如果要强制将特定的变量填充在一起,比如1、2和3应该总是一起填充,但在另一种情况下,仅4就足够了,您可以使用单独的构造函数,或者具有创建对象的有用名称的静态方法(如CreateFromId
、CreateFromNameAndAge
)。
如果您根本不在乎,您可以简单地创建一个无参数的构造函数(或者一个带有可选字段的构造函数),并使用对象初始化器设置所需的字段:
var x = new Class() { Field1 = 1, Field2 = "2" };
也许这是你在单个对象上做得太多的一个迹象,但是如果没有关于类设计的实际信息,我们就不能说那么多。
如果包有不同的用途(如ProductPackage
、PersonPackage
等),继承似乎也是一个不错的解决方案。共享属性驻留在基类中,所有特定属性都可以驻留在派生类中。
发布于 2015-09-28 00:52:46
构造函数提供了如何创建对象的指导方针。假设使用接口意味着指定需要存在的属性,则没有提供任何关于属性需要如何初始化的指导。
拥有多个构造函数应该更好,因为您提供了用户可以实例化对象的方法。这将允许您相应地初始化其他参数。
如果需要规定需要存在哪些字段,则仍然可以使用接口。
发布于 2015-09-28 00:58:32
此外,考虑使用Builder 模式。
下面是一个例子:
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;
}
}
https://stackoverflow.com/questions/32818969
复制