2011-07-03 13 views
5

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

:

  1. Do F # PowerPack olarak yapar ve farklı isimler Expr<'a> üzerinde Expr üzerinde EvalUntyped() : Expr -> obj ve Eval() : Expr<'a> -> 'a ile tanımlanmış yöntemler .
  2. 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 ve Eval() : 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)?

+2

Ö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.) –

+0

Ah, iyi nokta Tomas. Belki daha iyi bir benzetme IEnumerable.GetEnumerator() ve IEnumerable <'a> .GetEnumerator() 'dir. –

cevap

1

Bunun için kesin bir yanıt olmayabilir.

  1. diğer geliştiricilerin zaten F # ve resmi uzantıları ile çalışmak ne tutarlı bir stil tutmak için: Eğer gerçekten iman olmadıkça Ancak, F # PowerPack iki nedenden dolayı tarzlarını takip edip, "yanlış" tasarımını aldım .
  2. İki yöntemin dönüş türlerindeki farkı, önemli olduğu için daha açık bir şekilde göstermek için.

Cevabınızdaki benzerliğiniz Tomas'a iyi bir örnektir, ancak bu kodu kullanan diğer geliştiricilerin sahip olduğunuz tasarıma çok fazla önem vermeyebileceğini varsayalım. Resmi stillerle tutarlı ve en iyi niyetinizle açık olmak en iyisidir.

+0

İyi puanlar David, teşekkürler. Çerçeve Tasarım İlkeleri, daha iyi tasarımlar için bile tutarlılığı kırmaya karşı dikkatli olmalıdır. PowerPack tasarımını ilk karşılaştığımda kafa karıştırıcı bulduğumu söyleyeceğim ve yazılan ve yazılmamış alıntılar arasında giderken tekrar fazladan sorun çıkarmayı sağlıyor. –

İlgili konular