【发布时间】:2019-01-03 10:16:20
【问题描述】:
我有多个包含重复代码的类,尤其是成员和最重要的静态方法,它将创建该类的新实例并返回该实例:以前创建的实例在字典中注册或通过调用构造函数创建新实例.
接口是没有选择的,因为我有静态方法。我试图通过引入实现此静态方法的基类来解决该问题,但我找不到正确创建和返回特定子类的方法。
下面是当前情况的代码示例,A 类和 B 类显示重复代码。
public class A
{
private static readonly IDictionary<string, A> Registry = new Dictionary<string, A>();
public string Name { get; set; }
public A(string name)
{
this.Name = name;
}
public static A GetA(string instanceName)
{
lock (Registry)
{
if (!Registry.TryGetValue(instanceName, out var newInstance))
{
newInstance = new A(instanceName);
}
return newInstance;
}
}
}
然后在 B 类中又有一个成员 Name 和 GetX() 方法。
public class B
{
private static readonly IDictionary<string, B> Registry = new Dictionary<string, B>();
public string Name { get; set; }
public B(string name)
{
this.Name = name;
}
public static B GetB(string instanceName)
{
lock (Registry)
{
if (!Registry.TryGetValue(instanceName, out var newInstance))
{
newInstance = new B(instanceName);
}
return newInstance;
}
}
}
是否有可能通过引入基类或任何其他方式来避免这种代码重复?
【问题讨论】:
-
Mabe 制作基本方法,接受泛型类型,然后从中创建实例。见stackoverflow.com/questions/731452/…
-
但是如果字典是静态的,那么您将在
A和B之间共享同一个字典,这可能不是您想要的。 -
构造函数
public的可见性是有意的吗? -
为什么要根据
instanceName来限制实例数?是否允许A的实例和B的实例具有相同的instanceName? -
Name可以是基类/接口的一部分。至于GetX,你不能避免声明它,除非你能把它变成通用的,那么 base class 就是它通常应该在的地方。您仍然可以声明类型特定的静态方法来调用该通用方法,以方便这些类型的用户。
标签: c# inheritance code-duplication static-polymorphism