我肯定会在下面的代码中乱搞很多等等。似乎应该有一个更顺畅的方式。我基本上试图使用构建器方法(CreateNewPattern)来处理创建传递的子类类型的新对象(通过CreateNewCircularPattern和CreateNewLinePattern方法)。我目前只有两个子类型的CircularHolePattern和SingleLineHolePattern继承自HolePattern,但我希望随着我的应用程序的增长有更多。
这是一个使用委托或lambda的地方吗?它对它们一无所知,所以请尽可能具体和代码建议。
private CircularHolePattern CreateNewCircularPattern()
{
var CreatedPattern = CreateNewPattern(typeof(CircularHolePattern));
return (CircularHolePattern)CreatedPattern;
}
private SingleLineHolePattern CreateNewLinePattern()
{
var CreatedPattern=CreateNewPattern(typeof(SingleLineHolePattern));
return (SingleLineHolePattern)CreatedPattern;
}
private HolePattern CreateNewPattern(Type PatternTypeToCreate)
{
var NewHolePattern = (HolePattern)Activator.CreateInstance(PatternTypeToCreate);
NewHolePattern.PatternName = "Pattern #" + (HolePatterns.Count + 1).ToString();
this.AddPattern(NewHolePattern);
this.SetActivePattern(NewHolePattern);
return NewHolePattern;
}
答案 0 :(得分:6)
我怀疑你想要泛型:
private T CreateNewPattern<T>() where T : HolePattern, new()
{
var newHolePattern = new T();
newHolePattern.PatternName = "Pattern #" +
(HolePatterns.Count + 1).ToString();
this.AddPattern(newHolePattern);
this.SetActivePattern(newHolePattern);
return newHolePattern;
}
private SingleLineHolePattern CreateNewLinePattern() {
return CreateNewPattern<SingleLineHolePattern>();
}
private CircularHolePattern CreateNewCircularPattern() {
return CreateNewPattern<CircularHolePattern>();
}
T
是泛型类型参数;我们想要创建的类型。 where
表示“它必须是HolePattern
或子类型,并且它必须具有公共无参数构造函数” - 这允许我们使用new T()
创建它的新实例,并且根据此类实例(例如HolePattern
)访问PatternName
的所有成员。这也允许我们调用接受HolePattern
作为参数的方法。
答案 1 :(得分:0)
首先,您可以将Create ... Pattern方法缩小为
private CircularHolePattern CreateNewCircularPattern()
{
return CreateNewPattern(typeof(CircularHolePattern));
}
另一个建议可能是仅在抽象中工作。例如,仅从Create ... Pattern方法返回HolePattern类型,而不是它们的具体类型,如CircularHolePattern。在任何情况下,您都将它们转移到HolePattern。
因此,CreateNewCircularPattern变为
private HolePattern CreateNewCircularPattern()
{
return CreateNewPattern(typeof(CircularHolePattern));
}