Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Κληρονομικότητα και Generics

Îåêßíçóå áðü ôï ìÝëïò nullvoid. Τελευταία δημοσίευση από το μέλος rousso στις 27-10-2006, 12:59. Υπάρχουν 11 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  19-10-2006, 12:29 18815

    Κληρονομικότητα και Generics

    έχουμε ένα interface ITest και μία κλάση που το υλοποιεί CTest

    έχουμε και μία μέθοδο HelloWorld(IEnumerable<ITest> myenum)

    και όταν πάω να κάνω HelloWorld(c) όπου c είναι IEnumerable<CTest> δε με αφήνει ο compiler.

    Αν κάνω HelloWorld( (IEnumerable<ITest>) c ) τότε πετάει cast exception.

    Γιατί δεν επιτρέπεται αυτού του είδους η κληρονομικότητα;
  •  19-10-2006, 13:16 18817 σε απάντηση της 18815

    Απ: Κληρονομικότητα και Generics

    Αν κατάλαβα καλά τα παραπάνω, λογικό δεν είναι να συμβαίνει αυτό όταν προσπαθείς να περάσεις το c αφού είναι είναι ένα interface και όχι το instance από κάτι;
    Vir prudens non contra ventum mingit
  •  19-10-2006, 13:27 18818 σε απάντηση της 18815

    Απ: Κληρονομικότητα και Generics

     nullvoid wrote:
    έχουμε ένα interface ITest και μία κλάση που το υλοποιεί CTest

    έχουμε και μία μέθοδο HelloWorld(IEnumerable<ITest> myenum)

    και όταν πάω να κάνω HelloWorld(c) όπου c είναι IEnumerable<CTest> δε με αφήνει ο compiler.

    Αν κάνω HelloWorld( (IEnumerable<ITest>) c ) τότε πετάει cast exception.

    Γιατί δεν επιτρέπεται αυτού του είδους η κληρονομικότητα;

     

    Καλο θα ειναι να δινουμε το code snippet εδω ωστε να μπορουν και οι αλλοι και να καταλαβαινουν γρηγορα τι γινεται αλλα και μ'ενα copy/paste στο VS να μπορουν να πειραματιστουν ωστε να μπορουν να βοηθησουν.

    Τεσπα, κατι σαν το παρακατω κανεις ?

    using System;

    using System.Collections.Generic;

    namespace ConsoleApplication6

    {

       class Program

       {

             static void Main(string[] args) {

             IEnumerable<CTest> c = null; // put whatever valid here

             CTest test = new CTest();

             test.HelloWorld( (IEnumerable<ITest>) c);

             //test.HelloWorld(c);

          }

    }

       interface ITest { }

       class CTest : ITest

       {

             public void HelloWorld(IEnumerable<ITest> myenum) { }

          }

    }


    Software Engineer, specializes in Microsoft .net/C#, COM, Sql Server and now Python.
  •  19-10-2006, 13:42 18820 σε απάντηση της 18815

    Απ: Κληρονομικότητα και Generics

    Δυστυχώς στην C# 2.0 τα generic types έχουν μια "σταθερότητα" όσον αφορά το subtyping. Ελπίζουμε σε κάποια μελλοντική έκδοση της γλώσσας να μας δώσουν και αυτή την ευκολία.
    Palladinos Nick
    Software Engineer
    -----------------------
    The limits of my language mean the limits of my world. (Ludwig Wittgenstein)
  •  19-10-2006, 13:57 18824 σε απάντηση της 18820

    Απ: Κληρονομικότητα και Generics

    Όσοι θέλουν να το ψάξουν περαιτέρω: http://research.microsoft.com/~akenn/generics/ECOOP06.pdf

    Θέλει λίγο προσοχή με το μαθηματικό notation...


    Palladinos Nick
    Software Engineer
    -----------------------
    The limits of my language mean the limits of my world. (Ludwig Wittgenstein)
  •  19-10-2006, 21:31 18848 σε απάντηση της 18824

    Απ: Κληρονομικότητα και Generics

     PALLADIN wrote:
    Όσοι θέλουν να το ψάξουν περαιτέρω: http://research.microsoft.com/~akenn/generics/ECOOP06.pdf

    Εγώ λέω να παρουσιάσεις αυτό το pdf στο επόμενο event. To event θα λέγεται: "Πως να συρικνώσετε ένα community"!!!

    ΠΟΛΥ ψαγμένο!


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  19-10-2006, 22:35 18851 σε απάντηση της 18824

    Απ: Κληρονομικότητα και Generics

     PALLADIN wrote:
    Όσοι θέλουν να το ψάξουν περαιτέρω: http://research.microsoft.com/~akenn/generics/ECOOP06.pdf

    Θέλει λίγο προσοχή με το μαθηματικό notation...

    Να την πω την κακία μου; Θα την πω. Το paper αυτό είναι εμφανώς γραμμένο σε LaTeX. Πώς τους επιτρέπουν τέτοιες ανταρσίες στο MS Research;


    Νατάσα Μανουσοπούλου
  •  19-10-2006, 22:58 18852 σε απάντηση της 18851

    Απ: Κληρονομικότητα και Generics

    Επί της ουσίας τώρα, υπάρχει τρόπος να κάνεις αυτό που θέλεις: να κάνεις τη function να είναι κι αυτή generic, αλλά με περιορισμό στον τύπο της παραμέτρου της:

    void MyFunction<T>(IEnumerable<T> param) where T : IMyInterface

    Με αυτό τον τρόπο, μπορείς να της δώσεις για παράμετρο ένα οποιοδήποτε IEnumerable<T> που έχει γίνει instantiate με παράμετρο που υλοποιεί/κληρονομεί το IMyInterface.


    Νατάσα Μανουσοπούλου
  •  19-10-2006, 23:43 18855 σε απάντηση της 18852

    Απ: Κληρονομικότητα και Generics

    Ωραίο κόλπο! Δεν το ήξερα... Και απ'ότι είδα, μπορείς να ορίσεις και άλλα constraints όπως το T να είναι ή να έχει συγκεκριμένο τύπο, να έχει public constructor και να είναι value type ή reference type.
    Vir prudens non contra ventum mingit
  •  20-10-2006, 10:31 18873 σε απάντηση της 18855

    Απ: Κληρονομικότητα και Generics

    Covariant and contravariant generic type parameters υποστηρίζονται ήδη από το CLR 2.0 σε επίπεδο IL.

    Απλά δεν υποστηρίζονται από τις mainstream γλώσσες (που γνωρίζω τουλάχιστον). Ελπίζουμε ότι στο μέλλον θα μας κάνουν το χατίρι. Όσοι όμως θέλουν να βουτήξουν "σήμερα" μπορούν να το κάνουν σε IL

    Σύμφωνα με το paper η σύνταξη θα είναι

    interface IEnumerator<+T>

    ενώ σε IL

    .class interface public abstract

    'IEnumerator`1'<+([mscorlib]System.Object) T>


    Palladinos Nick
    Software Engineer
    -----------------------
    The limits of my language mean the limits of my world. (Ludwig Wittgenstein)
  •  20-10-2006, 21:15 18929 σε απάντηση της 18815

    Απ: Κληρονομικότητα και Generics

    ευχαριστώ για τις απαντήσεις, θα δοκιμάσω αυτή τη σύνταξη με το where.

    Παράξενο πάντως να μην είναι συμβατοί οι τύποι, δε νομίζετε;
  •  27-10-2006, 12:59 19336 σε απάντηση της 18815

    Απ: Κληρονομικότητα και Generics

    To θέμα που συζητάτε δεν έχει να κάνει με inheritance αλλά με variance σε generics.

    Είναι documented στο MSDN και μπορείτε να δείτε εδώ τι λέει η MS για το θέμα: http://msdn2.microsoft.com/en-us/library/ms228359.aspx

    Είναι πάντως ένας από τους βασικούς λόγους για τους οποίους δεν μπορείς προς το παρόν να κάνεις εκτεταμένη χρήση των generics. Όχι ότι δεν γίνεται τελικά. Απλά καταντάει πολύ πιο περίπλοκο από όσο χρειάζεται. Ελπίζω στο .Net 3 να έχει ξεπεραστεί κι αυτό.

    Αυτό που προτέινει η mns παίζει σε επίπεδο hello wolrd και σε αντίστοιχες καταστάσεις αλλά τελικά όταν χρησιμοποιείες generics έχεις συνήθως κατί πολύ πιο περίπρλοκο στο μυαλό σου....

    Το bottom line είναι ότι δεν υποστηρίζεται variance στα generics στο .Net framework 2.0. Οπότε ό,τι και να κάνεις σε αυτή την κατεύθυνση θα είναι κάποιου είδους workaround και θα εισάγει στο πρόβλημα που πας να λύσεις side-effects και overheads τόσο σε επίπεδο performance όσο και σε επίπεδο mainainance.

     

     


    rousso
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems