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

 

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

Non-Generic class inherits from a generic class of <T>

Îåêßíçóå áðü ôï ìÝëïò Nassos.NET. Τελευταία δημοσίευση από το μέλος Nassos.NET στις 02-05-2007, 18:21. Υπάρχουν 14 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  02-05-2007, 13:07 31220

    Non-Generic class inherits from a generic class of <T>

    Καλησπέρα σε όλους,

    Εχω μια απορία, εχω φτιάξει ενα generic Class of <T>, και θέλω να το κάνω Inherit σε μία non-Generic class χωρις να ορίσω το Type του <T>.

    ex

    public class GenClass<T>
    {
       private T _val;

       public T Value
       {
          get{return _Val;}
       }
    }

    public class NonGenClass : GenClass <T> //<-- εδώ χτυπαει το <T>
    {
    }

    Δεν θέλω να ορίσω εδώ το Type του <T> αλλα να το αφήσω σαν Type reference, Μπορω να το κάνω αυτό ??

    thnx in advance

    Νάσος


    "Success is the ability to go from one failure to another with no loss of enthusiasm."
    Winston Churchill

    "Quality means doing it right when no one is looking."
    Henry Ford

  •  02-05-2007, 13:59 31221 σε απάντηση της 31220

    Απ: Non-Generic class inherits from a generic class of <T>

    Μάλλον εννοείς ότι θέλεις και η NonGenClass να είναι generic;

        public class NonGenClass<T> : GenClass<T>
        {
        }

    Αν όχι, τότε πρέπει να ορίσεις κάτι στο T. π.χ.

        public class NonGenClass : GenClass<string>
        {
        }


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  02-05-2007, 14:24 31222 σε απάντηση της 31221

    Απ: Non-Generic class inherits from a generic class of <T>

    Καταρχήν ευχαριστώ Δημήτρη για την απαντηση,

    Ενδιαφέρομαι για την δευτερη περιπτωση που ανεφερες, αλλα ΧΩΡΙΣ να ορίσω το <T> ... μαλλον δεν γινετε, εκτός αν καποιος αλλος εχει κανεναν "μαϊμουδιάρικο" τροπο να γίνει.

    Να δώσω καποιες πληροφορίες παραπάνω για το τη θέλω να κάνω:

    Θέλω να φτιαξω Ενα Class που θα αντιπροσωπεύει το πεδίο σε ενα Table,View απο μια βάση, εχω φτιάξει 3 interfaces, ένα για να διαχιρείζετε το Schema, ένα για τις αλλαγές που εχουν γινει με events, και ενα Generic interface για να επιστρέφει/θέτει την Τιμή στο σωστό Type.

    Το Generic interface ειναι πολλή απλό:

    public interface IValue <T>
    {
       public T Value{get;set;}
    }

    Υπάρχει ενα class "Record" που εχει ένα collection απο Πεδία (Fields) και αν κάνω την Field (με Generic Interface) class generic τοτε εχω προβλημα με το Collection αφού Field <string> δεν ειναι το ίδιο με το Field <int>.

    Αυτά τα ολίγα, αν εχετε καποια ιδέα... Please Fire away!!

    Δεν το κλεινω το θέμα , μπας και καποιος εχει κάτι.

    Νάσος

     


    "Success is the ability to go from one failure to another with no loss of enthusiasm."
    Winston Churchill

    "Quality means doing it right when no one is looking."
    Henry Ford

  •  02-05-2007, 14:37 31224 σε απάντηση της 31222

    Απ: Non-Generic class inherits from a generic class of <T>

    Αν θέλεις δώσε ένα παράδειγμα (με κώδικα, όσο γίνεται λιγότερο). Δεν ξέρω αν κατάλαβα τι εννοείς.
     


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  02-05-2007, 14:49 31225 σε απάντηση της 31224

    Απ: Non-Generic class inherits from a generic class of &lt;T&gt;

    Περιμένω το παράδειγμά σου...αλλά δες κι αυτό. Μπορείς να έχεις και generic members χωρίς να είναι απαραίτητα σε generic class.

    π.χ.
        public interface MyInterface
        {
            T MyGenericFunction<T>();
        }


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  02-05-2007, 15:18 31227 σε απάντηση της 31222

    Απ: Non-Generic class inherits from a generic class of <T>

    Αυτό που θέλεις να κάνεις είναι ένα N-tuple από αντικείμενα άγνωστων τύπων κατά το compile. Τα generics, παρότι υποστηρίζονται από το CLR, και νομίζω ότι με reflection μπορείς να δημιουργήσεις όποιο instance θέλεις από ένα generic τύπο, δεν είναι μάλλον κατάλληλα για να κάνεις αυτό που έχεις κατά νου.
    Θα πρέπει είτε να θυσιάσεις το ελεύθερο πλήθος των πεδίων, και να έχεις κάτι του τύπου:

    class SixTuple<A, B, C, D, E, F>
    {
        IValue<A> a;
        ...
        IValue<F> f;
    }

    που βεβαίως είναι άσχημο και ίσως και άχρηστο, ή να μην έχεις generic το IValue.
    Δεν μπορώ να σκεφτώ καμία "πονηρή" λύση που να λύνει το πρόβλημά σου.
    Πάντως τη λειτουργικότητα που αναζητάς μπορείς να τη βρεις έτοιμη στο DataSet.

    Νατάσα Μανουσοπούλου
  •  02-05-2007, 15:19 31228 σε απάντηση της 31224

    Απ: Non-Generic class inherits from a generic class of <T>

    ok Λίγος κωδικας:

    public interface IFieldSchema
    {
       Type DataType {get;set}
       string Key {get;set;}
       string Allias {get;set;}
       bool IsPrimaryKey {get;}
       bool IsForeighKey {get;}
    }

    public interface IFieldValue
    {
       public List<object> History {get;}
       ...
       ...
    }

    public interface <T> IValue
    {
       T Value{get;set}
    }

    public inerface IField : IFieldSchema,IFieldValue
    {}

    public inerface IRecord
    {
       List<IField> Fields {get;}
    }

    //Implementation of the Interfaces όπως το έχω τωρα!
    public class FieldBase :IField
    {
       ...
       ...
    }

    public class FieldGenBase <T> : FieldBase : IValue<T>
    {
       ...
       ...
    }

    public class RecordBase : IRecord
    {
       ...
       ...
    }

    //Τώρα μεσα στην RecordBase δημιουργώ τα Field:

    FieldGenBase <string> field = new FieldGenBase <string>();
    Fields.Add(field as FieldBase );
    FieldGenBase <int> field = new FieldGenBase <int>();
    Fields.Add(field as FieldBase );

    //Το προβλημα ειναι ότι το για να πάρω το Value property IValue<T> πρέπει να μασκάρω το IField
    // Του collection σε FieldGenBase <string> ή FieldGenBase <int> κτλ!

    Ιδανικό θα ήταν το

    public inerface IField : IFieldSchema,IFieldValue
    {}

    να γίνει:

    public inerface IField : IFieldSchema,IFieldValue,IValue<T>
    {}

     

    PS. Νομίζω οτι το Generic Member δεν γινετε να εχει returned Value T (αν δεν ειναι generic το class, Interface), τουλάχιστον στο βιβλίο νομίζω κατι τετοιο ελεγε.

    Αυτό που θέλω να πετύχω ειναι: IField.Value να επιστρέφει την τιμή στο σωστό Type.

    Ελπίζω να διευκρίνησα λιγο, αν θες περισσότερες πληροφορίες πες να σου ποσταρω όλο το Project

    thnx in advance

    Nassos



    "Success is the ability to go from one failure to another with no loss of enthusiasm."
    Winston Churchill

    "Quality means doing it right when no one is looking."
    Henry Ford

  •  02-05-2007, 15:30 31230 σε απάντηση της 31225

    Απ: Non-Generic class inherits from a generic class of <T>

    Dimitris Papadimitriou:

    Περιμένω το παράδειγμά σου...αλλά δες κι αυτό. Μπορείς να έχεις και generic members χωρίς να είναι απαραίτητα σε generic class.

    π.χ.
        public interface MyInterface
        {
            T MyGenericFunction<T>();
        }

    I stand Corrected !!!! Γινετε το :

    Τ MyMethod<T>();

    αλλα δεν μπορω να το κάνω Bind σε ένα control, αν δεν μπορω να το κανω καλύτερα θα καταλήξω σε αυτήν την λύση.

    Νατάσα, το σκεφτηκα και αυτό αλλα πολλύ messy ειναι.

    Ευχαριστώ και τους δυο, και περιμένω και αλλες ιδέες αν κάποιος εχει.

    Νάσος


    "Success is the ability to go from one failure to another with no loss of enthusiasm."
    Winston Churchill

    "Quality means doing it right when no one is looking."
    Henry Ford

  •  02-05-2007, 15:35 31231 σε απάντηση της 31230

    Απ: Non-Generic class inherits from a generic class of <T>

    Επίσης άλλη μία ερώτηση για Generics:

    μπορώ να κανω το εξής?

    Type t = Type.GetType("System.Int32");

    FieldGenBase <t> field = new FieldGenBase <t>();

    Αντί για :

    FieldGenBase <int> field = new FieldGenBase <int>();


    "Success is the ability to go from one failure to another with no loss of enthusiasm."
    Winston Churchill

    "Quality means doing it right when no one is looking."
    Henry Ford

  •  02-05-2007, 17:05 31239 σε απάντηση της 31231

    Απ: Non-Generic class inherits from a generic class of <T>

    Καλησπέρα φιλε Νάσσο

    Αυτό που ζητάς μπορεί να γίνει με τον παρακάτω κώδικα

    Type genericType = typeof (FieldGenBase<>).MakeGenericType(typeof (int));
    FieldGenBase<int> value = (FieldGenBase<int>) Activator.CreateInstance(genericType);

     


    Palladinos Nick
    Software Engineer
    -----------------------
    The limits of my language mean the limits of my world. (Ludwig Wittgenstein)
  •  02-05-2007, 17:13 31241 σε απάντηση της 31239

    Απ: Non-Generic class inherits from a generic class of <T>

    Νίκο, δεν έχει performance hit αυτό?Δεν θα ήταν απλά καλύτερο να σχεδιαστεί λίγο διαφορετικά το όλο implementation ώστε να μην χρειάζεται τέτοιο "μπλέξιμο"?

    Παναγιώτης Κεφαλίδης

    "Για να επιτύχεις, θα πρέπει το πάθος σου για την επιτυχία να είναι μεγαλύτερο απο τον φόβο σου για την αποτυχία"

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Παρακαλώ διαβάστε τους όρους χρήσης.
  •  02-05-2007, 17:27 31247 σε απάντηση της 31239

    Απ: Non-Generic class inherits from a generic class of <T>

    Φίλε Νίκο,

    χμμ.. δεν ήξερα αυτό τον τροπο, το κακό είναι οτι παλι κάνεις initialazation του FieldGenBase στατικά

    (FieldGenBase<int> value = (FieldGenBase<int>)...)

     που σημαίνει οτι πρέπει να το κανω για κάθε τυπό στον κώδικα, αυτό που σκεφτηκα και εκανα αυτήν την ερώτηση ειναι να περναω το Type σε μία Function να κανει initialazation του στύλ

    public void CreateField (Type SenderType)

    {

       FieldGenBase<SendedType> value = new FieldGenBase<SendedType>();

    }

    και έτσι με μία γραμμή κώδικα να κάνω Handle όλους τους τύπους, και αυτούς που μπορώ να σκεφτώ εγω (Ο Developer) αλλά και τους νέους που ίσως βγούν στην πορεία ( Απο της ανάγκες του Προγραμματος που θα χρησιμοποιεί αυτό το Framework, αλλα και τις αλλαγές απο καινουργιο SQL 10, κτλ).

    Πάντος ευχαριστώ για την απάντηση ;-)

     

     


    "Success is the ability to go from one failure to another with no loss of enthusiasm."
    Winston Churchill

    "Quality means doing it right when no one is looking."
    Henry Ford

  •  02-05-2007, 17:31 31248 σε απάντηση της 31241

    Απ: Non-Generic class inherits from a generic class of <T>

    Έχεις δίκιο Παναγιώτη...

    Υπάρχει performance hit... Απλά για να μιλήσουμε για performance πρέπει να έχουμε ένα συγκεκριμένο application context και συγκεκριμένα performance requirements...Γενικά θέλω μετρήσεις και νουμεράκια για να αποφασίσω :)

    Πάντως θέλει πολύ προσοχή όταν σχεδιάζεις generic frameworks χρησιμοποιώντας generics...


    Palladinos Nick
    Software Engineer
    -----------------------
    The limits of my language mean the limits of my world. (Ludwig Wittgenstein)
  •  02-05-2007, 18:02 31253 σε απάντηση της 31247

    Απ: Non-Generic class inherits from a generic class of <T>

    Φιλε Νάσσο

    Νομίζω ότι πρέπει να τραβήξεις κάποιες διαχωριστικές γραμμές στο framework που χτίζεις.

    Το static κομμάτι του framework θα πρέπει να δίνει compile time safety στους application developers... Οποτε χρησιμοποιούμε Generics και τέτοιου τύπου compiler centric ιδέες.

    Το dynamic κομμάτι του framework θα πρέπει να δίνει code-less ευκολίες στους framework developers... Οποτε παίζουμε με reflection ή και με διαφορες meta-programming τεχνικές.

    Το πως θα παντρέψουμε αυτούς τους δυο κόσμους είναι και το μεγάλο στοίχημα...

    Καλή συνεχεια στο framework που χτίζεις


    Palladinos Nick
    Software Engineer
    -----------------------
    The limits of my language mean the limits of my world. (Ludwig Wittgenstein)
  •  02-05-2007, 18:21 31255 σε απάντηση της 31253

    Απ: Non-Generic class inherits from a generic class of <T>

    Ok, αποφάσισα θα το βαλω στο Blog μου εδώ στο DotNETZone.gr.  Με specifications, και τα αρχικά βήματα που εχω κάνει, και ετσι

    1. Θα ανακαλύψουμε τον Τροχο ξανά!! (πραγματικα αυτο μεσα σε αλλα με εκανε να ξεκινήσω αυτό το Framework, αφου υπάρχουν λύσεις όπως το NHibernate, κ.α.).

    2. Ισως να φανει χρήσημω σε καποιους "as is" ή σε άλλους για μελέτη λογικής.

    3. Επίσης μέτα απο 4 χρόνια στον επαγγελματικό προγραματισμό είμαι αποφασισμένος να εφαρμόσω UML που στο Πανεπιστήμιο (Swansea University of Wales) φωνάζανε οτι όλα απο εκεί πρέπει να αρχίζουν πριν απο την όποια γραμμή κώδικα (Δεν περναγες το Μαθημα Java αν δεν περναγες το UML!!).

    4. Δεν θα ειναι κάτι δικό μου, αλλα όλων μας, αφου καθε σχόλιο θα ενσωματώνεται στο Project.

    PS. Το κλείνω το θέμα, για στατιστικούς λόγους αφου πήρα απάντηση.

    Θέλω να ευχαριστησω ολους σας για το χρονο που διαθέσατε (που ειναι πολύτιμος) και την βοήθεια σας.

    Νάσος 


    "Success is the ability to go from one failure to another with no loss of enthusiasm."
    Winston Churchill

    "Quality means doing it right when no one is looking."
    Henry Ford

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