我已经编程了15年,但我是C#的新手,对一般的强类型语言缺乏经验,所以如果这是一个超级菜鸟问题我会道歉。
我试图避免相当多的重复代码,并且无法找到一种方法来做我想做的事情。这是我目前所拥有的一个例子:
class BaseModel {
string sharedProperty1;
string sharedProperty2;
string sharedProperty3;
string sharedProperty4;
string sharedProperty5;
string sharedProperty6;
}
class ExtendedModelA : BaseModel {
string exclusivePropertyA;
}
class ExtendedModelB : BaseModel {
string exclusivePropertyB;
}
// --------
dynamic finalModel;
if( conditionA )
{
finalModel = new ExtendedModelA{
sharedProperty1 = 1,
sharedProperty2 = 2,
sharedProperty3 = 3,
sharedProperty4 = 4,
sharedProperty5 = 5,
sharedProperty6 = 6,
exclusivePropertyA = "foo"
};
}
else
{
finalModel = new ExtendedModelB{
sharedProperty1 = 1,
sharedProperty2 = 2,
sharedProperty3 = 3,
sharedProperty4 = 4,
sharedProperty5 = 5,
sharedProperty6 = 6,
exclusivePropertyB = "bar"
};
}
正如您所看到的,存在大量冗余,因为初始化值的唯一差异是每个上的exclusiveProperty
(在我的特定情况下,我在{的每一半中有大约30个属性重复{ {1}}并且只有2或3个唯一的)。我想做的是初始化一个"模板"使用所有if/else
值只模拟一次,而sharedProperty
内只需要初始化if/else
值。
这里有一些伪代码来说明我想做的事情的概念,但我还没有能够让它发挥作用。
exclusiveProperty
我熟悉可以用来接受"模板"的工厂模式。和#34;扩展"作为参数,但这就像简单地保留我的重复一样多的代码,所以我正在寻找更直接的东西?这样做的方法。
答案 0 :(得分:2)
我认为在不重复代码的情况下,最简单的方法是在if else块中创建具有唯一属性的对象,然后在最后分配所有共享属性。这样可以防止您不得不重复代码。
BaseModel finalModel = null;
if (conditionA)
{
finalModel = new ExtendedModelA()
{
exclusivePropertyA = "some value";
};
}
else
{
finalModel = new ExtendedModelB()
{
exclusivePropertyB = "some other value";
};
}
finalModel.sharedProperty1 = "asdf";
// assign the rest of the values
您还可以拥有基础模型的构造函数,该构型函数将基础模型作为参数并将所有值分配给新对象。这基本上是使用原始模板来创建新的。然后,您可以使用模板创建扩展类,并将其传递给基础构造函数。
class BaseModel
{
public string sharedProperty1 { get; set; }
public string sharedProperty2 { get; set; }
public string sharedProperty3 { get; set; }
public string sharedProperty4 { get; set; }
public string sharedProperty5 { get; set; }
public string sharedProperty6 { get; set; }
public BaseModel(BaseModel t)
{
//assign template properties
}
public BaseModel()
{
}
}
class ExtendedModelA : BaseModel
{
public string exclusivePropertyA { get; set; }
public ExtendedModelA(BaseModel t)
: base(t)
{
}
}
class ExtendedModelB : BaseModel
{
public string exclusivePropertyB { get; set; }
public ExtendedModelB(BaseModel t)
: base(t)
{
}
}
然后使用它将是
BaseModel template = new BaseModel()
{
//assign values
};
ExtendedModelA = new ExtendedModelA(template)
{
exlusivePropertyA = "asdf";
};
答案 1 :(得分:1)
你的第二次尝试几乎是正确的。您只需要将BaseModel
ctor添加到ExtendedModelA
& ExtendedModelB
:
class ExtendedModelA : BaseModel
{
public ExtendedModelA(BaseModel b)
: base(b)
{
}
}
然后这样称呼:
BaseModel template = new BaseModel
{
// init code
};
finalModel = new ExtendedModelA(template); // note the parenthesis's not curly braces