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

 

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

Class Inheritance και Object Conversion

Îåêßíçóå áðü ôï ìÝëïò flougr. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 15-06-2007, 21:35. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  15-06-2007, 18:27 32957

    Class Inheritance και Object Conversion

    Έχω φτιάξει ένα σύνολο κλάσεων σε VB.NET (vs 2005), που έχουν την εξής Ιεραρχία :

     

    Interface Service.ServiceA

    Public MustInherit Class BaseClass
    .
    .
    .
    End Class

    Public Class DerivedClass
    Inherits BaseClass
    .
    .
    .
    End Class

    End Interface

    Οι παραπάνω κλάσεις περιέχουν μόνο Public και Friend Properties (Set , Get) και δέν περιέχουν καμμία λειτουργικότητα.
    Η λειτουργικότητα υλοποιείται σε ένα άλλο σύνολο κλάσεων με την εξής ιεραρχία :

    Interface Service.ServiceA.Provider1

    Public MustInherit Class BaseClass
    Inherits Service.ServiceA.BaseClass
    .
    .
    .
    End Class

    Public Class DerivedClass
    Inherits Service.ServiceA.Provider1.BaseClass
    .
    .
    .
    End Class

    End Interface

    Τα properties στα δυο σύνολα κλάσεων είναι ακριβώς τα ίδια.Η μόνη διαφορά είναι οτι το δεύτερο set κλάσεων (Service.ServiceA.Provider1) Έχει Private μεθόδους που υλοποιούν τη λειτουργικότητα του Αντικειμένου.

    Το πρόβλημα μου είναι το εξης :

    ¨Οταν προσπαθώ να κάνω convert ένα αντικείμενο Service.ServiceA.DerivedClass σε Service.ServiceA.Provider1.DerivedClass το Visual Studio μου επιστρέφει "Value of type Service.ServiceA.DerivedClass cannot be converted to Service.ServiceA.DerivedClass"

    Για να γίνει πιο κατανοητό τι θέλω να κάνω , πρέπει να αναφέρω οτι το project είναι Web Service και συνεπώς δε μπορώ να χρησιμοποιήσω interfaces.Επίσης δε μπορώ να υλοποιήσω τη λειτουργικότητα των μεθόδων μέσα στο ίδιο το WebService γιατί θέλω στο μέλλον να μπορώ να φτιαξω έναν άλλο Provider π.χ Service.ServiceA.Provider2 χώρις να υπάρξει πρόβλημα με όσους clients χρησιμοποιούσαν ως τώρα τον Provider1.

    Πρός το παρόν έχω λυσει το πρόβλημα κάνοντας assign μια μια καθε Property του ενος αντικειμένου στο άλλο.
    Όμως θα ήθελα έναν πιο κομψό τρόπο , και κυρίως να καταλάβω τι γίνεται και δέν παίζει το Explicit convert.

    Flougr

     

  •  15-06-2007, 18:32 32959 σε απάντηση της 32957

    Απ: Class Inheritance και Object Conversion

    Αν κατάλαβα καλά, αναφέρεσαι σε αυτό το πρόβλημα: http://www.dotnetzone.gr/cs/forums/thread/17256.aspx

     


    Vir prudens non contra ventum mingit
  •  15-06-2007, 19:10 32960 σε απάντηση της 32959

    Απ: Class Inheritance και Object Conversion

    Βασικά το πρόβλημα με τα interfaces στα webServices ήταν ο λόγος που με ανάγκασε να φτιάξω δύο ίδια set κλάσεων.
    Επειδή το webService θα είναι ανοιχτό και θα μπορέι να γράψει ο καθένας Client Implementations θέλω να μείνω σε μία λύση που το μόνο που θα απαιτεί απο τούς δημιουργούς του client είναι η κλήση webMethods χωρις να απαιτείται καμμία επέμβαση στο proxy κώδικα του WebService.
    Στη συγκεκριμένη περίτωση αυτό που θα ήθελα να μάθω είναι απλο και ίσως λιγο ¨χαζο" 

    Μπορώ να κάνω convert (Χωρις να γράψω custom Converters) 2 αντικείμενα που έχουν την εξης ιεραρχία ;

    Class A1
    Class B1 inherits A1

    Class A2 inherits A1
    Class B2 inherits A2



    'Θέλω να κάνω το εξης :
    Dim obj1 as B1=New B1
    Dim obj2 as B2=New B2

    obj2=obj1

    ' ή

    obj2=Ctype(obj1,B2)

    Όλα τα αντικείμενα έχουντ ακριβώς τους ίδιους public ορισμούς properties.

     

  •  15-06-2007, 19:33 32961 σε απάντηση της 32960

    Απ: Class Inheritance και Object Conversion

    Δηλαδή, σαν να λες ότι θέλεις να κάνεις cast ένα ListBox σε ένα Button, αφού και τα δύο κάνουν inherit την κλάση Control?


    Vir prudens non contra ventum mingit
  •  15-06-2007, 20:57 32963 σε απάντηση της 32961

    Απ: Class Inheritance και Object Conversion

    Οχι ακριβώς.

    Το Β2 κάνει inherit το Α2 , το οποίο με τη σειρά του κάνει inherit το A1.

    To B1 κάνει απευθείας inherit το Α1 .

    Και επισης το A2 έχει ακριβώς τα ίδια Public properties με το A1, και το B2 τα ίδια ακριβώς public properties με το B1.

    Για να δώσω ένα πιο συγκεκριμένο παράδειγμα :


    Namespace A
    Public MustInherit Class Person
    Private _Name As String

    Public Property Name() As String
    Get
    Return (_Name)

    End Get
    Set(ByVal value As String)
    _Name = value
    End Set
    End Property


    End Class

    Public Class Employee
    Inherits Person
    Private _Salary As Integer
    Public Property Salary() As Integer
    Get
    Return _Salary
    End Get
    Set(ByVal value As Integer)
    _Salary = value
    End Set
    End Property

    End Class

    End Namespace

    Namespace A.Provider
    Public MustInherit Class Person
    Inherits A.Person


    Private _Salary As Integer
    Public Overloads Property Salary() As Integer
    Get
    Return _Salary + 1
    End Get
    Set(ByVal value As Integer)
    _Salary = value
    End Set
    End Property


    End Class

    Public Class Employee
    Inherits A.Provider.Person


    End Class
    End Namespace

    Namespace Test
    Public Class Test
    Dim B1 As A.Employee = New A.Employee
    Dim B2 As A.Provider.Employee = New A.Provider.Employee
    Public Sub Test()
    B2 = CType(B1, A.Provider.Employee) ' ΕΔΩ ΕΜΦΑΝΙΖΕΙ "Error 2 Value of type 'A.Employee' cannot be converted to 'A.Provider.Employee'"


    End Sub

    End Class

    End Namespace

     

    Από ότι καταλαβαίνω μάλλον δεν γίνεται , αν και διαισθητικά περίμενα να μπορεί να γίνει.
    Μάλλον θα πρέπει να γράψω κάποιον Custom Converter.

    Ευχαριστώ πάντως για τη συζήτηση

  •  15-06-2007, 21:35 32964 σε απάντηση της 32963

    Απ: Class Inheritance και Object Conversion

    Ο λόγος που δεν μπορείς να δεις μία κλάση B1 ως B2 ή το αντίστροφο είναι ότι ανήκουν σε διαφορετικούς κλάδους της ιεραρχίας. Για να μπορέσεις να τις δεις θα έπρεπε να ανήκουν στον ίδιο κλάδο. Μπορείς όμως να τις δεις ως Α1 καθώς και οι δύο κληρονομούν από την Α1.

    Υποψιάζομαι ότι ίσως δεν έχεις καταλάβει πως ακριβώς δουλεύει το inheritance. Το inheritance έχει την έννοια ότι η κλάση Β1 ΕΙΝΑΙ ταυτόχρονα και Α1, δεν μετατρέπεται σε Α1. Μπορείς να θέσεις σε μία μεταβλητή τύπου Α1 ένα αντικείμενου τύπου Β1 επειδή το αντικείμενο Β1 ΕΙΝΑΙ Α1. Δεν το μετατρέπεις εκείνη τη στιγμή.

    Η ιεραρχία που περιγράφεις είναι:

          Α1
    ------|-------
    |            |
    Α2           Β1
    |
    Β2

    Το Β2 είναι Α1, το Β1 είναι Α1, αλλά το Β2 και το Β1 δεν έχουν κάποια άμεση σχέση μεταξύ τους. Μπορείς όμως να αναθέσεις αντικείμενα και του Β1 και του Β2 σε μεταβλητές τύπου Α1.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems