İkinci arayüzün tüm uygulamalarının, önceki uygulamaların bazı uygulamalarının yapamayacağı şeyleri yararlı bir şekilde yapabilmesi bekleniyorsa, yeni üyeler eklemeden başka bir arayüze miras kalan bir arayüze sahip olmanın yanlış bir yanı yoktur. Gerçekten de, IMHO'nun .net Framework gibi şeylerde daha fazla kullanılması gereken iyi bir modeldir, özellikle de sınıfı daha türetilmiş arayüzün getirdiği kısıtlamaları doğal olarak karşılayacak bir uygulayıcı, daha türetilmiş arayüzü uygulayarak bunu gösterebilir. üye-uygulama kodunu veya bildirimlerini değiştirmek zorunda kalmadan.
Örneğin, arayüzlerim olduğunu varsayalım:
arayüz IMaybeMutableFoo {
Bar Thing {get; set;} // Ve diğer özellikler de
bool IsMutable;
IImmutableFoo AsImmutable ();
}
arayüz IImmutableFoo: IMaybeMutableFoo {};
Bir uygulamanın IImmutableFoo.AsImmutable()
kendiliğinden geri dönmesi beklenir; değişebilir bir sınıf uygulamasının IMaybeMutableFoo.AsImmutable()
verilerin anlık görüntüsünü içeren derinden değişmeyen yeni bir nesne döndürmesi beklenir. A'da tutulan verilerin anlık görüntüsünü saklamak isteyen bir rutin IMaybeMutableFoo
aşırı yükler sunabilir:
genel void StoreData (IImmutableFoo ThingToStore)
{
// ThingToStore'un değişmez olduğu bilindiğinden referansı kaydetmek yeterli olacaktır
}
genel void StoreData (IMaybeMutableFoo ThingToStore)
{
StoreData (ThingToStore.AsImmutable ()); // Daha spesifik aşırı yükü arayın
}
Derleyicinin depolanacak şeyin bir olduğunu bilmediği durumlarda IImmutableFoo
arayacaktır AsImmutable()
. Öğe zaten değiştirilemezse işlev hızlı bir şekilde dönmelidir, ancak arabirim üzerinden bir işlev çağrısı hala zaman alır. Derleyici öğenin zaten bir olduğunu biliyorsa IImmutableFoo
, gereksiz işlev çağrısını atlayabilir.
IAnimal
veIDog
olan korkunç tautology isimleri!