Cevabım: kötü tasarım seçimi. ;-)
Bu sözdizimi etkisine odaklanan ilginç bir tartışmadır. Bence argümanın özü, tasarım kararının kapalı statik sınıflara yol açmasıdır. Statik sınıfın adlarının alt adların arkasına saklanmak ('kafa karıştırıcı') yerine en üst düzeyde görünen şeffaflığına mı odaklanılıyor? Üs veya çocuğa doğrudan erişebilen bir dil uygulaması kafa karıştırıcı olabilir.
Bir şekilde statik kalıtım olduğunu varsayarak sahte bir örnek tanımlandı.
public static class MyStaticBase
{
SomeType AttributeBase;
}
public static class MyStaticChild : MyStaticBase
{
SomeType AttributeChild;
}
Şunlara yol açar:
// ...
DoSomethingTo(MyStaticBase.AttributeBase);
// ...
aynı depolama alanını etkileyebilir (?)
// ...
DoSomethingTo(MyStaticChild.AttributeBase);
// ...
Çok kafa karıştırıcı!
Fakat bekle! Derleyici, her ikisinde de aynı imzayı taşıyan MyStaticBase ve MyStaticChild ile nasıl başa çıkacaktı? Çocuk yukarıdaki örneğimi geçersiz kılarsa, aynı depolamayı DEĞİŞTİRMİYOR, belki? Bu daha da karışıklığa yol açar.
Sınırlı statik kalıtım için güçlü bir bilgi alanı gerekçesi olduğuna inanıyorum. Kısaca sınırlar hakkında daha fazla bilgi. Bu sözde kod değeri gösterir:
public static class MyStaticBase<T>
{
public static T Payload;
public static void Load(StorageSpecs);
public static void Save(StorageSpecs);
public static SomeType AttributeBase
public static SomeType MethodBase(){/*...*/};
}
Sonra alırsınız:
public static class MyStaticChild : MyStaticBase<MyChildPlayloadType>
{
public static SomeType AttributeChild;
public static SomeType SomeChildMethod(){/*...*/};
// No need to create the PlayLoad, Load(), and Save().
// You, 'should' be prevented from creating them, more on this in a sec...
}
Kullanım gibi görünüyor:
// ...
MyStaticChild.Load(FileNamePath);
MyStaticChild.Save(FileNamePath);
doSomeThing(MyStaticChild.Payload.Attribute);
doSomething(MyStaticChild.AttributeBase);
doSomeThing(MyStaticChild.AttributeChild);
// ...
Statik çocuğu oluşturan kişinin, platformun veya ortamın serileştirme motoruna getirilebilecek herhangi bir sınırlamayı anladığı sürece serileştirme süreci hakkında düşünmesi gerekmez.
Statikler (tekiltonlar ve diğer 'küreseller' formları) genellikle yapılandırma depolaması etrafında gelir. Statik miras, bu tür bir sorumluluk tahsisinin, bir yapılandırma hiyerarşisiyle eşleşmesi için sözdiziminde temiz bir şekilde temsil edilmesine izin verecektir. Gösterdiğim gibi, temel statik kalıtım kavramları uygulanırsa büyük belirsizlik potansiyeli vardır.
Doğru tasarım seçiminin belirli sınırlamalarla statik mirasa izin vermek olduğuna inanıyorum:
- Hiçbir şeyi geçersiz kılma yok. Çocuk temel öznitelikleri, alanları veya yöntemleri değiştiremez ... Aşırı yükleme, derleyicinin alt öğeyi ve tabanı sıralamasına izin veren bir imza farkı olduğu sürece tamam olmalıdır.
- Yalnızca genel statik tabanlara izin verin, genel olmayan statik bir tabandan devralamazsınız.
Aynı mağazayı genel bir başvuru ile değiştirmeye devam edebilirsiniz MyStaticBase<ChildPayload>.SomeBaseField
. Ancak genel türün belirtilmesi gerektiğinden cesaretiniz kırılacaktır. Çocuk referans temizleyici olurdu da: MyStaticChild.SomeBaseField
.
Bir derleyici yazarı değilim, bu yüzden bir derleyicide bu kısıtlamaları uygulamanın zorlukları hakkında bir şey eksik olup olmadığından emin değilim. Bununla birlikte, sınırlı statik kalıtım için bilgi alanı ihtiyacı olduğuna dair güçlü bir inancım var ve temel cevap, zayıf (veya aşırı basit) bir tasarım seçimi nedeniyle yapamayacağınızdır.