Projemde, özel özellikleri uygulayan sınıfların hiyerarşisi var. Konsol uygulaması için istediğim şeye daha yakın.OOP tasarım desenleriyle temel sınıf özelliği genişletilebilirlik mekanizmasının nasıl daha iyi uygulanacağı
class Property
{
string key;
object value;
public Property(string key, object value)
{
this.key = key;
this.value = value;
}
public override string ToString()
{
return "(key=" + key + ": value=" + value + ")";
}
}
public struct PropertyConfig
{
public string key;
public object defaultValue;
}
abstract class BaseClass
{
Dictionary<string, Property> properties = new Dictionary<string, Property>();
Dictionary<string, PropertyConfig> mergedConfigs = new Dictionary<string, PropertyConfig>();
public BaseClass()
{
MergeWithInheritedConfigsAndCreateInstances(
new PropertyConfig[]
{
new PropertyConfig() { key = "p1", defaultValue = "v1" },
new PropertyConfig() { key = "p2", defaultValue = "v2" }
},
true);
}
protected void MergeWithInheritedConfigsAndCreateInstances(PropertyConfig[] configs = null, bool IsBaseClass = false)
{
configs = configs ?? new PropertyConfig[] { };
foreach (PropertyConfig config in configs)
{
mergedConfigs[config.key] = config;
}
if (!IsBaseClass)
{
CreatePropertyInstancesAfterMerge();
}
}
private void CreatePropertyInstancesAfterMerge()
{
foreach (KeyValuePair<string, PropertyConfig> kvp in mergedConfigs)
{
PropertyConfig config = kvp.Value;
properties.Add(config.key, new Property(config.key, config.defaultValue));
}
}
public override string ToString()
{
return GetType().Name + ".Properties: " + string.Join(",", properties.Select(kvp => kvp.Value.ToString()).ToArray());
}
}
class DerivedClassA : BaseClass
{
public DerivedClassA(): base()
{
MergeWithInheritedConfigsAndCreateInstances();
}
}
class DerivedClassB : BaseClass
{
public DerivedClassB() : base()
{
MergeWithInheritedConfigsAndCreateInstances(new PropertyConfig[]
{
new PropertyConfig() { key = "p2", defaultValue = true },
new PropertyConfig() { key = "p3", defaultValue = "v3" }
});
}
}
class DerivedClassC : BaseClass
{
public DerivedClassC() : base()
{
MergeWithInheritedConfigsAndCreateInstances(new PropertyConfig[]
{
new PropertyConfig() { key = "p2", defaultValue = false },
new PropertyConfig() { key = "p4", defaultValue = "v4" }
});
}
}
class Program
{
static void Main(string[] args)
{
DerivedClassA derivedA = new DerivedClassA();
DerivedClassB derivedB = new DerivedClassB();
DerivedClassC derivedC = new DerivedClassC();
Console.WriteLine(derivedA.ToString());
Console.WriteLine(derivedB.ToString());
Console.WriteLine(derivedC.ToString());
Console.ReadLine();
}
}
Taban soyut sınıf türetilmiş sınıfları kalıtsal amaçlanan kendi özellik nesnelerin bir konfigürasyon oluşturur.
Yapıcı yapılandırma dizisinde MergeWithInheritedConfigsAndCreateInstances
yöntem çağrısı geçirilir, ikinci parametre true
olarak ayarlanarak, özellik nesnelerinin başlatılmasının ertelenmesi gerektiğini belirtir.
Birleştirilen özellik yapılandırmasının geçerli durumu, mergedConfigs
Dictionary
'da depolanır.
Türetilmiş sınıfları temel sınıf konfigürasyonu özelliği örnekleri birleştirme sonrasında oluşturulması gerekir belirten varsayılan değerine false
ayarlanmış ikinci parametre ile Oluşturucu MergeWithInheritedConfigsAndCreateInstances
yöntemi çağrı ile geçersiz/birleştirme yerel özelliği yapılandırmasını geçmektedir.
Ortaya çıkan çıktı aşağıdadır.
DerivedClassA.Properties: (key=p1: value=v1),(key=p2: value=v2)
DerivedClassB.Properties: (key=p1: value=v1),(key=p2: value=True),(key=p3: value=v3)
DerivedClassC.Properties: (key=p1: value=v1),(key=p2: value=False),(key=p4: value=v4)
Ve ihtiyacım olan şey, ama ben sevmiyorum bu çözümün bazı dezavantajları vardır: Her yapıcı içinde MergeWithInheritedConfigsAndCreateInstances
aramak gereklidir
1). İkinci parametre, soyut sınıf yapıcısında sağlanmalıdır.
Tüm birleştirme/somutlaştırma mekanizmasının temel sınıfta uygulandığı ve çağrıldığı bir çözüm bulmak istiyorum. Ve türetilmiş sınıf özel özellik yapılandırmasını bir yöntem parametresi olarak değil, üye alan/özellik (belki statik?) Olarak tanımlayabilmek.
2) Birleştirme işlemi her zaman sınıfı başlatılır.
Sadece bir kez yapmayı tercih ederim. (Statik kurucuya yerleştiriliyor musunuz?)
YUKARI: Yeniden yazılan örnek kod, daha iyi bir fikir ortaya koymaktadır.
Bilginize: Bu XAML/WPF bağımlılık özellikleri ile kaputun altında işliyor .. –
Kodumda wpf yapılarına güvenemiyorum. Gereksinimler benzer görünse de, wpf bağımlılık özelliği sisteminin iç uygulaması, alanlarına özgüdür ve uygulama ayrıntıları olduğu gibi burada tekrar kullanılamaz. –
Bu, onların somut sınıflarını yeniden kullanmakla ilgili değildi, aksine arkasındaki fikir ...:/ –