Έχουμε ξεφύγει λίγο γιατί το παράδειγμα που χρησιμοποιούμε δεν είναι και το καλύτερο για να μιλήσουμε για το θέμα που συζητάμε τελικά σε αυτή την φάση. Όμως γενικά ισχύει το εξής: Εφόσον χρειαστέι να αλλάξει η συμπεριφορά της GetMid θα πρέπει να γίνει με hidding (ή shadowing όπως το λέτε εσείς) μια και δεν μπορεί ως static να γίνει override. Το hidding επίσης σε αντίθεση με το overriding επιτρέπει να αλλάξει και το return type της μεθόδου σε κάτι "πιο λογικό" (λιγότερο abstract) για την κάθε περίπτωση. Εφόσον μιλάμε για static method το hidding δεν έχει επίσης τον κίνδυνο να μην κληθεί το new implementation (κίνδυνος που θα υπήρχε αν η GetMid ήταν instance method, όπότε και θα ήταν προτιμότερο το override).
Anyway. Το MethodBase.GetCurrentMethod().ReflectedType το έβαλα εκεί ως "άσκηση" (ή food-for-thought) και όχι επειδή ήταν απαραίτητο. Αν υποθέσει κανείς ότι θα χρειαστεί να γίνει hide η μέθοδος και ότι το new implementation θα καλέσει το base implementation (σύνολο δύο υποθέσεις/προϋποθέσεις), τότε έχει τον λόγο ύπαρξης που σας ανέφερα σε προηγούμενα posts. Δηλαδή ότι δεν θα αφήσει μια κλήση της GetMid να δημιουργήσει (ενώ κατ' αρχήν ως έχει θα μπορούσε) νέα instances οποιωνδήποτε sub-classes της Mid που δεν βρίκονται κάτω από το ίδιο banch του class hierarchy με εκείνο το οποίο χρησιμοποιήθηκε για να γίνει η κλήση της GetMid. Έστι (με βάση την ονοματολογία που χρησιμοποίησα σε προηγούμενα posts) η κλήση SMid.GetMid(typeof(AMid2)) δεν θα "καρποφορήσει" καθώς η AMid2 δεν είναι sub-class της SMid (ενώ αντίθετα η κλήση Mid.GetMid(typeof(AMid2)) ή η κλήση AMid.GetMid(typeof(AMid2)) θα επιστρέψουν ωραιότατα ένα AMid2 object).
αυτά...
φιλικά
rousso
υ/γ: χαίρομαι που βοήθησα να γίνει τόσο πολύ συζήτηση για αυτό το θέμα!
rousso