У меня есть несколько классов, содержащих дублированный код, особенно члены и, что наиболее важно, статический метод, который создаст новый экземпляр класса и вернет этот экземпляр: либо ранее созданный экземпляр, зарегистрированный в словаре, либо новый экземпляр путем вызова конструктора.
Интерфейс - это не вариант, потому что у меня есть статический метод. Я попытался решить проблему, представив базовый класс, реализующий этот статический метод, но не могу найти способ правильно создать и вернуть конкретный дочерний класс.
Ниже приведен пример кода текущей ситуации с классом 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 снова есть имя члена и метод 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;
}
}
}
Есть ли возможность избежать такого дублирования кода, введя базовый класс или любым другим способом?
A
иB
, что может быть не тем, что вам нужно. - person Michał Turczyn   schedule 03.01.2019public
видимостью? - person Spotted   schedule 03.01.2019instanceName
? Разрешено ли, что и экземплярA
, и экземплярB
с одинаковымinstanceName
? - person Spotted   schedule 03.01.2019Name
может быть частью базового класса / интерфейса. Что касаетсяGetX
, вы не можете избежать его объявления, если вы не можете сделать его универсальным, тогда базовый класс - это то место, где он обычно должен быть. Вы по-прежнему можете объявить статический метод конкретного типа для вызова этого универсального метода для удобства пользователей этого типа. - person Sinatr   schedule 03.01.2019