Właśnie skończyłem czytać sekcję o członkach rozszerzeń w II Edycji ramowych, autorstwa Krzysztofa Cwaliny i Brada Abramsa, ale nie znalazłem na to przykładu. Moje pytanie dotyczy super i podkategorii w bibliotece F #, ale spodziewam się, że odpowiedź jest odpowiednia dla wszystkich języków .NET.Wytyczne projektowania metod rozszerzenia: czy podobna nazwa metody powinna być taka sama dla sub i super klasy?
F # ma dwa typy, super typ Expr
i podtyp typu Expr<'a>
, gdzie drugi to tylko opakowanie dla typowej wersji tego pierwszego. Są to typy używane w wyrażeniach cudzysłowu.
Gdybym chciał określić metody rozszerzenie na temat tych typów dla ich oceny, która byłaby lepsza konstrukcja:
- zrobić jak F # PowerPack robi i zdefiniowane sposoby z różnymi nazwami
EvalUntyped() : Expr -> obj
naExpr
iEval() : Expr<'a> -> 'a
naExpr<'a>
. - Zrób coś bliższego temu, co zrobiłbyś, gdybyś posiadał typy i używał tej samej nazwy (gdzie metoda na super typie może być uważana za wirtualną, a metoda na podtypie może być uważana za nadrzędną super wirtualna metoda). tj.
Eval() : Expr -> obj
naExpr
iEval() : Expr<'a> -> 'a
naExpr<'a>
.
Druga opcja wydaje mi się bardziej poprawna, ale chciałbym postępować zgodnie z wszelkimi wytycznymi dotyczącymi projektowania: czy istnieje jakikolwiek autorytatywny precedens dla tego (przypuśćmy, że jest to "złe" w PowerPack)?
Nie wiem, jakie są zalecenia. Należy zauważyć, że jeśli 'Eval' był standardową metodą wirtualną, to typ pochodny nie byłby w stanie zmienić jej typu. (Argumentem musi być 'Expr' .Zmienianie wyniku z' obj' na ''a' również nie jest dozwolone, ale będzie to dźwięk typu.) –
Ach, dobry punkt Tomas. Być może lepszą analogią jest 'IEnumerable.GetEnumerator()' oraz 'IEnumerable <'a> .GetEnumerator()'. –