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

 

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

Default Interface Implementation

Îåêßíçóå áðü ôï ìÝëïò infoCENTER. Τελευταία δημοσίευση από το μέλος PALLADIN στις 05-09-2010, 21:11. Υπάρχουν 9 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  02-09-2010, 20:26 59857

    Default Interface Implementation

    Είχα κάνει την ίδια ερώτηση και παλιότερα όταν είχαμε το VS.2008 και λέω να την ξανακάνω τώρα που έχουμε το 2010.

    Το ερώτημα είναι το εξής, έχω δηλώσει ένα Interface το οποίο θέλω να υλοποιούν κάποιες Classes μου και έχω ήδη φτιάξει ένα Implementation για αυτό το Interface. Μπορώ μέσα από τις Classes μου όταν δηλώσω ότι κάνουν implement το Χ interface να ορίσω να χρησιμοποιούν το default implementation που θα έχω ήδη φτιάξει; Εναλλακτικά θα μπορούσα να κάνω inherit από μία class που θα έκανε implement το interface αυτό αλλά δεν είναι πάντα βολική αυτή η προσέγγιση όταν έχεις classes με μεγάλο inheritance tree και αυτές που θέλεις να κάνουν implement το interface είναι σε διαφορετικό leaf στο inheritance tree.

    Αν όχι σε πιο site θα μπορούσα να πάω για να το προτείνω σαν ιδέα υλοποίησης σε κάποια επόμενη έκδοση του Framework;

  •  02-09-2010, 21:54 59858 σε απάντηση της 59857

    Απ: Default Interface Implementation

    Δεν έχει αλλάξει, ούτε πρόκειται να αλλάξει κάτι. Αυτό που ζητάς απλά είναι αντίθετο στη λογική των interfaces. Ένα interface είναι απλά και μόνο μία συλλογή από signatures. Από τη στιγμή που αρχίζεις να μιλάς για implementation έχεις πάψει να μιλάς για interface. 

    Αν θέλεις να προσθέσεις λειτουργικότητα σε κάποιες κλάσεις χωρίς να χρησιμοποιήσεις inheritance υπάρχουν διάφοροι τρόποι, οι οποίοι δουλεύανε ήδη από το .NET 2.0, όπως π.χ. να χρησιμοποιήσεις το decorator pattern. Με το .ΝΕΤ 3.5 προστέθηκαν τα extensions και με το 4.0 ήρθε και το dynamic. 

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  02-09-2010, 21:58 59859 σε απάντηση της 59857

    Απ: Default Interface Implementation

    Έστω ότι έχεις μια κλάση public ClassΑ. Τι μπορείς να κάνεις για να έχεις υλοποιήσεις το public InterfaceB:

    • Η public κλάση ClassΑ μπορεί να υλοποιεί το public InterfaceB. Αυτό σημαίνει ότι η κλάση έχει μέσα κώδικα που υλοποιεί το InterfaceB.
    • Η internal κλάση ClassC έχει τον κώδικα που χρειάζεται το InterfaceB - δεν είναι απαραίτητο να υλοποιεί το InterfaceB. Η ClassA υλοποιεί το InterafeB - κατά την δημιουργία της, δημιουργεί ένα αντικείμενο της ClassC, που το χρησιμοποιεί για να υλοποιήσει το InterfaceB.
    • H public abstract κλάση ClassD υλοποιεί το InterfaceB. Η κλάση ClassA δεν υλοποιεί το InterfaceB, αλλά κληρονομεί από την κλάση ClassD, μαζί και το InterfaceΒ με την υλοποιησή του.
    • Και λίγο Decoration Pattern:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
       
      public interface InterfaceB
      {
      	int FunctionA();
      	void FunctionB();
      }
      
      public class ClassA
      {
      	public int PropertyA { get; set; }
      	public int FunctionA1() { return 1; }
      	public int FunctionA2() { return 1; }
      
      }
      
      public class ClassE<T> : InterfaceB
      {
      	#region ' InterfaceB Members '
      
      	public int FunctionA()
      	{
      		return 1;
      	}
      
      	public void FunctionB()
      	{
      		return;
      	}
      
      	#endregion
      }

    Στην τελευταία περίπτωση μπορείς να πάρεις το Interface ως εξής:

    1
     
    InterfaceB b = new ClassE<ClassA>();

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  03-09-2010, 01:13 59860 σε απάντηση της 59859

    Απ: Default Interface Implementation

    Τώρα που το ξαναβλέπω θα μπορούσα να κάνω καλύτερο το decoration...

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
     public class ClassE<T> : InterfaceB
    		where T : new()
    {
    		public T BaseObject { get; private set; }
    
    		public ClassE()
    		{
    				this.BaseObject = new T();
    		}
    
    		#region ' InterfaceB Members '
    
    		public int FunctionA()
    		{
    				return this.BaseObject.FunctionA1;
    		}
    
    		public void FunctionB()
    		{
    				return;
    		}
    
    		#endregion
    }

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  04-09-2010, 03:57 59869 σε απάντηση της 59858

    Απ: Default Interface Implementation

    Παναγιώτης Καναβός:
    Δεν έχει αλλάξει, ούτε πρόκειται να αλλάξει κάτι. Αυτό που ζητάς απλά είναι αντίθετο στη λογική των interfaces. Ένα interface είναι απλά και μόνο μία συλλογή από signatures. Από τη στιγμή που αρχίζεις να μιλάς για implementation έχεις πάψει να μιλάς για interface. 

    Αν θέλεις να προσθέσεις λειτουργικότητα σε κάποιες κλάσεις χωρίς να χρησιμοποιήσεις inheritance υπάρχουν διάφοροι τρόποι, οι οποίοι δουλεύανε ήδη από το .NET 2.0, όπως π.χ. να χρησιμοποιήσεις το decorator pattern. Με το .ΝΕΤ 3.5 προστέθηκαν τα extensions και με το 4.0 ήρθε και το dynamic. 

    Δεν νομίζω ότι αυτό που ζητάω είναι αντίθετο με την λογική των Interfaces Παναγιώτη. Δεν λέω να καταργήσω τα Interfaces αλλά να μειώσω τον κώδικα που θέλω να γράψω σε διάφορες classes που υλοποιούν ένα συγκεκριμένο Interface με τον ίδιο ακριβώς τρόπο. Μέχρι τώρα η λογική των Interfaces είναι να δίνουν ένα σταθερό signature μιας class χωρίς να γνωρίζουμε τίποτα για το implementation. Εγώ απλά το πάω ένα βήμα παρακάτω. Να φτιάξουμε για αυτό το signature ένα implementation και να έχουμε την δυνατότητα όταν λέμε σε μία class ότι κάνει implement ένα interface να μπορούμε να ορίσουμε και το default implementation του interface αυτού αν το θέλουμε. Δεν βλέπω λοιπόν πως είναι αντίθετο στην λογική των interfaces. Από την στιγμή που έχουν φτάσει μέχρι τα Generics δεν νομίζω ότι είναι δύσκολο να φτιάξουν και αυτό έτσι ώστε η κάθε class να περνάει τα δικά της στοιχεία σε generic κώδικα που θα έχουμε φτιάξει για το default implementation του interface αυτού.

  •  04-09-2010, 18:21 59871 σε απάντηση της 59869

    Απ: Default Interface Implementation

    infoCENTER:
    Να φτιάξουμε για αυτό το signature ένα implementation και να έχουμε την δυνατότητα όταν λέμε σε μία class ότι κάνει implement ένα interface να μπορούμε να ορίσουμε και το default implementation του interface αυτού αν το θέλουμε. Δεν βλέπω λοιπόν πως είναι αντίθετο στην λογική των interfaces.

    Για αυτό υπάρχουν τα abstract classes: Δημιουργείς το interface, το υλοποιείς σε μια abstract class, και το κληρονομείς από όποια class το χρειάζεσαι. Κάνεις μια αλλαγή στην abstract και αμέσως την κληρονομούν όλοι...

    infoCENTER:
    Από την στιγμή που έχουν φτάσει μέχρι τα Generics δεν νομίζω ότι είναι δύσκολο να φτιάξουν και αυτό έτσι ώστε η κάθε class να περνάει τα δικά της στοιχεία σε generic κώδικα που θα έχουμε φτιάξει για το default implementation του interface αυτού.

    Αυτό είναι το decorator pattern, που βλέπεις την υλοποίηση 2 δημοσιεύσεις πιο πάνω...

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  05-09-2010, 14:46 59877 σε απάντηση της 59871

    Απ: Default Interface Implementation

    George J. Capnias:
    infoCENTER:
    Να φτιάξουμε για αυτό το signature ένα implementation και να έχουμε την δυνατότητα όταν λέμε σε μία class ότι κάνει implement ένα interface να μπορούμε να ορίσουμε και το default implementation του interface αυτού αν το θέλουμε. Δεν βλέπω λοιπόν πως είναι αντίθετο στην λογική των interfaces.

    Για αυτό υπάρχουν τα abstract classes: Δημιουργείς το interface, το υλοποιείς σε μια abstract class, και το κληρονομείς από όποια class το χρειάζεσαι. Κάνεις μια αλλαγή στην abstract και αμέσως την κληρονομούν όλοι...

    infoCENTER:
    Από την στιγμή που έχουν φτάσει μέχρι τα Generics δεν νομίζω ότι είναι δύσκολο να φτιάξουν και αυτό έτσι ώστε η κάθε class να περνάει τα δικά της στοιχεία σε generic κώδικα που θα έχουμε φτιάξει για το default implementation του interface αυτού.

    Αυτό είναι το decorator pattern, που βλέπεις την υλοποίηση 2 δημοσιεύσεις πιο πάνω...

     

    George J.

     

    George μάλλον δεν με διαβάζεις προσεχτικά... Από το πρώτο post είπα πως ένα τρόπος για να υλοποιήσω αυτό που θέλω είναι να χρησιμοποιήσω inheritance όμως αυτό δεν μπορεί να γίνει πάντα γιατί τα classes που θέλω να κάνουν implement το συγκεκριμένο Interface ανήκουν σε διαφορετικά leafs του inheritance tree. Μα τι λέω, εδώ μπορεί να έχω και classes που να μην είναι καν στο ίδιο inheritance tree.

    Όσο για το Decorator Pattern νομίζω πως εξ ορισμού απαιτεί οι Classes που θα γίνονται decorate θα πρέπει να είναι του ίδιου τύπου. Οι classes μου όμως ήδη κάνουν inherit κάποιες άλλες classes. Τώρα στο παράδειγμα που μου έδωσες επειδή δεν γνωρίζω C# δεν έχω απαντήσει ακόμα γιατί προσπαθώ να βρω λίγο χρόνο για να το δω και να το γυρίσω σε VB. Ίσως σήμερα Κυριακή να τα καταφέρω. Μία ερώτηση επάνω στο παράδειγμα. Η εντολή :

    InterfaceB b = new ClassE<ClassA>();

    επιστρέφει ένα Instance της ClassE; Και ClassE δεν είναι αυτή που κάνει implement το Interface;

  •  05-09-2010, 16:06 59879 σε απάντηση της 59877

    Απ: Default Interface Implementation

    Στην VB:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    Public Class ClassA
    
      Private PropertyAValue As Integer
      Public Property PropertyA() As String
        Get
          Return PropertyAValue
        End Get
        Set(ByVal value As String)
          PropertyAValue = value
        End Set
      End Property
    
      Public Function FunctionA1() As Integer
        Return 1
      End Function
    
      Public Function FunctionB1() As Integer
        Return 1
      End Function
    
    End Class
    
    Public Interface InterfaceB
      Function FunctionA() As Integer
      Sub FunctionB()
    
    End Interface
    
    Public Class ClassE(Of T As {New})
      Implements InterfaceB
    
      Private BaseObjectValue As T
      Public Property BaseObject() As T
        Get
          Return BaseObjectValue
        End Get
        Private Set(ByVal value As T)
          BaseObjectValue = value
        End Set
      End Property
    
      Public Sub New()
        Me.BaseObject = New T()
      End Sub
    
      Public Function FunctionA() As Integer Implements InterfaceB.FunctionA
        Return 1
      End Function
    
      Public Sub FunctionB() Implements InterfaceB.FunctionB
        Return
      End Sub
    
    End Class

    Και μπορείς να το χρησιμοποιήσεις έτσι:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Imports AppBusinessVB
    Module Module1
    
      Sub Main()
        Dim b As InterfaceB = New ClassE(Of ClassA)
        Dim a As Integer = b.FunctionA()
        b.FunctionB()
    
      End Sub
    
    End Module

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  05-09-2010, 19:20 59881 σε απάντηση της 59879

    Απ: Default Interface Implementation

    To Decorator pattern σε όλες τις περιπτώσεις θα μπορούσε να σε βοηθήσει για το Scenario που θέλεις να υλοποιήσεις, απλά θα πρέπει να το λάβεις υπόψιν σου στον σχεδιασμό εξαρχής. Θα μπορούσες πχ να έχεις Base Classes όπως σου δείχνει ο Γιώργος και να κάνεις Inherit απο εκεί, υλοποιώντας interfaces στις Base Classes και κάνοντας inherit μετά. Συνδιασμός abstract classes και interfaces μπορεί να σου δώσει το αποτέλεσμα που θέλεις.

    Ίσως απλά σε μπερδεύει λίγο το ότι δεν είναι τόσο straightforward όταν δεν το έχεις ξανακάνει ή απλά το έχεις κάνει σε μικρό βαθμό κι όχι τόσο σύνθετο. Ξέρω ότι είναι μόνο μπλα μπλα το post μου, αλλά έχει απαντηθεί απο τα παιδιά code-wise οπότε προσπαθώ να σου δώσω "ψυχολογικό" boost, χεχεχε! Smile


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

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

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Παρακαλώ διαβάστε τους όρους χρήσης.
  •  05-09-2010, 21:11 59882 σε απάντηση της 59857

    Απ: Default Interface Implementation

    Καλησπέρα σε όλους τους φίλους.

    Αυτό που ζητάς θα μπορούσες να το βρείς σε γλώσσες που υποστηρίζουν traits (όπως η Scala). 

    Ίσως, σε κάποια μελλοντική έκδοση, η MS να μας δώσει κάτι ανάλογο. 
    Για μια βαθύτερη μελετη του θέματος μπορείς να ξεκινησεις απο εδώ.

    Palladinos Nick
    Software Engineer
    -----------------------
    The limits of my language mean the limits of my world. (Ludwig Wittgenstein)
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems