Sadece Krzysztof Cwalina ve Brad Abrams tarafından hazırlanan ve 2. Çerçeve Tasarım Kılavuzunda yer alan uzatma üyeleri bölümünü okudum ve bunun için bir örnek bulamadı. Sorum, bir F # kitaplığındaki bir süper ve alt sınıfı ilgilendiriyor, ancak cevabın tüm .NET dilleriyle alakalı olmasını bekliyorum.Eklenti yöntemi tasarım yönergeleri: Alt ve süper sınıf için benzer bir yöntem adı aynı mıdır?
F # iki tür, süper tip Expr
ve ikincisi eski bir daktilo versiyonu için sadece bir sarıcı alt tipi Expr<'a>
sahiptir. Bunlar tırnak ifadeleri için kullanılan türlerdir. Daha iyi bir tasarım olacağını, onları değerlendirmek için bu türdeki uzatma yöntemlerini tanımlamak isteseydik
:
- Do F # PowerPack olarak yapar ve farklı isimler
Expr<'a>
üzerindeExpr
üzerindeEvalUntyped() : Expr -> obj
veEval() : Expr<'a> -> 'a
ile tanımlanmış yöntemler . - Eğer türlere sahipseniz ve aynı adı kullanırsanız (süper tipteki yöntemin sanal olarak düşünülebileceğini düşündüğünüzde ve alt türdeki yöntemin geçersiz kılınacağı düşünülüyorsa) ne yapacağınıza daha yakın bir şey yapın. süper sanal yöntem).
Eval() : Expr -> obj
,Expr
veEval() : Expr<'a> -> 'a
,Expr<'a>
.
İkinci seçenek benim için daha doğru görünüyor, ama ben ne olursa olsun tasarım kuralları olabilir sonucunu öğrenmek istiyorum: Bunun için herhangi bir yetkili öncelik kullanılır (bunu PowerPack içinde "yanlış" var varsayarak)?
Önerilerin ne olduğunu bilmiyorum. Unutulmaması gereken bir nokta, eğer "Eval" standart bir sanal yöntem olsaydı, türetilen türün türünü değiştiremeyeceği. (Bu argümanın “Expr” olması gerekir. “Obj” den “a” a kadar sonucun değiştirilmesine de izin verilmez, ama bu tip ses olur.) –
Ah, iyi nokta Tomas. Belki daha iyi bir benzetme IEnumerable.GetEnumerator() ve IEnumerable <'a> .GetEnumerator() 'dir. –