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

 

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

multi level - inheritance

Îåêßíçóå áðü ôï ìÝëïò Alex_. Τελευταία δημοσίευση από το μέλος Alex_ στις 22-09-2008, 20:30. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  22-09-2008, 11:23 44817

    multi level - inheritance

    Έστω ότι έχουμε ένα σημείο Point το οποίο έχει ιδιότητες Χ και Υ και από απορέει μια τάξη σχήμα Shape2D που έχει ιδιότητες ένα πίνακα από πολλά σημεία Points , είναι δυνατόν να καλέσουμε πολλαπλές φορές τον δομητή Constructor της βασικής τάξης base class (Point) εφόσον το δισδιάστατο σχήμα έχει πολλαπλά σημεία; Απο αυτο να κληρονομεί μια άλλη τάξη Circle
    Οπότε να ορίζουμε το κύκλο ακτινα - σημείο και αυτόματα να πηγαίνει στη βασική τάξη Shape2d να λέει ότι εχουμε ένα σημείο αποθηκευσέτο στον πίνακα Points. Αν είχαμε άλλο σχήμα να αποθήκευε πολλά σημεία. Είναι δυνατόν να καλέσουμε πολλές φορές το δομητή της βασικής τάξης στο δομητή της απορέουσας τάξης
    Αν ναι πως γίνεται;Μηπως υπάρχει άλλος τρόπος
    Έυχαριστώ
    πχ.

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace Inheritance
    {
    class Program
    {
    static void Main(string[] args)
    {
    Circle c = new Circle(10,new Point(0,0));
    }
    }
    class Circle :Shape2D
    {
    private int _radius;
    private Point _center;
    public int Radius
    {
    get
    {
    return _radius;
    }
    set
    {
    _radius = value;
    }
    }
    public Point Center
    {
    get
    {
    return _center;
    }
    set
    {
    _center = value;
    }
    }

    public Circle(int radius,Point center):base(1)
    {
    _center = center;
    _radius = radius;
    }
    }
    class Point
    {
    private int _x;
    private int _y;

    //constructor
    public Point(int x,int y)
    {
    _x = x;
    _y = y;
    }
    public int X
    {
    get
    {
    return _x;
    }
    set
    {
    _x= value;
    }
    }
    public int Y
    {
    get
    {
    return _y;
    }
    set
    {
    _y = value;
    }
    }

    public override string ToString()
    {
    return "[x="+_x+"] ,[y="+_y+"]";
    }
    }
    class Shape2D : Point
    {
    private Point[] _points;

    //constructor
    public Shape2D(int points):base(1,1)
    {

    for (int p=0; p < points;p++ )
    {
    _points[p] = new Point(0,0);
    }
    }
    }
    }

    }
  •  22-09-2008, 12:33 44821 σε απάντηση της 44817

    Απ: Multiple inheritance

    Βασικά υπάρχει άλλος τρόπος, να αλλάξεις τα arguments του constructor σε Points[] ώστε να παίρνει τα σημεία του κάθε σχήματος και να αρχικοποιεί.
    Εκανα και άλλες δύο τάξεις οι οποίες κληρονομούν το Shape2d (Square , Hexagon) και επικάλυψα τη μεθοδο ToString() του Shape2D και την καλώ μέσα από το δομητή για να  φαίνεται  στην κονσόλα τα σημεία που είναι αποθηκευμένα για κάθε σχήμα. Υπαρχει τρόπος να δωσεις παραμετροποιημένες τιμές μέσω κάποιας μεταβλητής όταν καλείς τη base class ή χρήση των μεθόδων για ορισμό των τιμών είναι αναπόφευκτη.


    διορθωμένο το παραπάνω παράδειγμα το οποίο δε δούλευε γιατί δεν είχα ορίσει τον πίνακα Points σε αντικείμενο
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace Inheritance
    {
    class Program
    {
    static void Main(string[] args)
    {
    Circle c = new Circle(2, new Point(10, 2));
    Square s = new Square();
    Hexagon h = new Hexagon();
    Console.WriteLine("Press any key to continue");
    Console.ReadKey();
    }
    }
    class Hexagon : Shape2D
    {
    public Hexagon(): base(new Point[] { new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0),new Point(0, 0), new Point(0, 0) })
    {

    }
    }
    class Square : Shape2D
    {
    public Square() :base(new Point[]{new Point(0,0),new Point(0,0),new Point(0,0),new Point(0,0)})
    {

    }

    }
    class Circle :Shape2D
    {
    private int _radius;
    private Point _center;
    public int Radius
    {
    get
    {
    return _radius;
    }
    set
    {
    _radius = value;
    }
    }
    public Point Center
    {
    get
    {
    return _center;
    }
    set
    {
    _center = value;
    }
    }

    public Circle(int radius,Point center):base(new Point[]{new Point(0,0)})
    {
    _center = center;
    _radius = radius;
    }
    }
    class Point
    {
    private int _x;
    private int _y;

    //constructor
    public Point(int x,int y)
    {
    _x = x;
    _y = y;
    }
    public int X
    {
    get
    {
    return _x;
    }
    set
    {
    _x= value;
    }
    }
    public int Y
    {
    get
    {
    return _y;
    }
    set
    {
    _y = value;
    }
    }

    public override string ToString()
    {
    return "[x="+_x+"] ,[y="+_y+"]";
    }
    }
    class Shape2D : Point
    {
    private Point[] _points;

    //constructor
    public Shape2D(Point[] points):base(1,1)
    {
    _points = new Point[points.Length];
    for (int p=0; p < points.Length;p++ )
    {
    Random r = new Random(100);
    _points[p] = new Point(points[p].X,points[p].Y);
    }
    Console.WriteLine(ToString());
    }

    public override string ToString()
    {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < _points.Length; i++)
    {
    sb.AppendLine("[x = " + _pointsIdea.X + " ,y = " + _pointsIdea.Y + "]");
    }
    return sb.ToString();
    }
    }
    }

  •  22-09-2008, 12:42 44822 σε απάντηση της 44817

    Απ: Multiple inheritance

    Όπα αρχηγέ μου, όπα: Κατ' αρχήν στην περιγραφή σου στο κείμενο δεν είσαι ιδιαίτερα επεξηγηματικός. Κατά δεύτερον αυτό που περιγράφεις δεν είναι πολλαπλή κληρονομικότητα! Κατα τρίτον μου φαίνεται ότι έχεις ορισμένα λαθάκια.

    Ας τα δούμε τα πράγματα απο την αρχή. Πολλαπλή κλρονομικότητα είναι να έχεις τις κλάσεις Α, Β, C και να μπορείς να πεις: class Z: A, B, C κάτι το οποίο στη C# δεν επιτρέπεται. Γίνεται εμμέσως με τη χρήση interfaces αλλά αυτό είναι ένα άλλο ζήτημα. Επιπλέον στον κώδικα σου λες ότι η Shape2d κληρονομεί την Point και έχει και ένα πίνακα απο Points. Πρακτικά στην ίδια κλάση συνθέτεις και κληρονομείς την ίδια κλάση (Point) κάτι το οποιό δεν είναι και η καλύτερη πρακτική. Δες το από την καθημερινότητα: Λες ότι ένα σχήμα έχει ένα σύνολο σημείων (σύνθεση) αλλά δε λές ότι ένα σχήμα είναι ένα σημείο (κληρονομικότητα). Θα σου συνηστούσα την κληρονομικότητα να τη βγάλεις. Δες αυτά για την ώρα και ό,τι άλλο θέλεις τα ξαναλέμε.

    PS: Δε σε βολεύουν οι έτοιμες κλάσεις του System.Drawing;;


    Πλιζ ντοντ ράιτ γκρίκλισ. Άι καντ ριντ δεμ. Egina katanoitos?
  •  22-09-2008, 12:58 44823 σε απάντηση της 44822

    Απ: πολυεπίπεδη κληρονομικότητ

    εχεις δικιο δεν είναι πολλαπλη κληρονομηκότητα είναι παραπλανητικός ο τίτλος συγνώμη. Έχεις δίκιο και στις παρατηρήσεις σου.
    re PS: Απλά πειραματίζομαι για να καταλάβω πως δουλεύει η κληρονομικότητα , υπάρχει κάνα καλύτερο παράδειγμα ? με ενδιαφέρει η πολυεπίπεδη κληρονομικότητα (αυτός έπρεπε να είναι και ο τίτλος μπορώ άραγε να τον αλλάξω?)
    ευχαριστώ starfigther

  •  22-09-2008, 16:08 44828 σε απάντηση της 44823

    Απ: πολυεπίπεδη κληρονομικότητ

    Εεε εμένα μου φαίνεται πάντως ότι ήδη τον άλλαξες!Smile Όχι δεν είναι άσχημο ως παράδειγμα αλλά κατά τη γνώμη μου το κάνεις με λάθος τρόπο. Για παράδειγμα λες οτι η Circle επεκτείνει την Shape2D αλλά μέσα ορίζεις πάλι ένα Point ως κέντρο. Γιατί; Στο δομητή της Circle κάνε

    public Circle(int radius,Point center):base(new Point[]{center})
    {
      _radius = radius;
    }

    Το property Center μετά γίνεται ως εξής:

    public Point Center
    {
      get
      {
        return _points[0];
      }
      set
      {
        _points[0] = value;
      }
    }

    Δεδομένου ότι δηλώνεις την _points protected και όχι private όπως την έχεις τώρα. Το _center φυσικά δεν είναι απαραίτητο οπότε το σβήνεις. Επιπλέον πρέπει να βάλεις κι έναν getter ή indexer στη Shape2D.

    Εξακολουθώ να μην καταλαβαίνω όμως τι εννοείς με τον όρο πολυεπίπεδη. Εννοείς μια ιεραρχία του τύπου class D:C class C:B class B:A ;


    Πλιζ ντοντ ράιτ γκρίκλισ. Άι καντ ριντ δεμ. Egina katanoitos?
  •  22-09-2008, 20:30 44832 σε απάντηση της 44828

    Απ: πολυεπίπεδη κληρονομικότητα

    Απλά δεν είχα ξεκαθαρίσει τις έννοιες has a (συνθεση) με το is a (inheritance)
    Ναι εννοω μια ιεραρχία του τυπου αυτού class D:C class C:B class B:A ;
    Επίσης από ότι βλέπω στο βιβλίο των Bruce Eckel & Larry O'brien - Thinking In C Sharp μπορείς να έχεις μεταβλητή οταν καλείς τη base class κάτι που δεν ήξερα αν γίνεται.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    //:c06:Chess.cs
    // Inheritance, constructors and arguments.
    public class Game {
    internal Game(int i) {
    System.Console.WriteLine("Game constructor");
    }
    }
    public class BoardGame : Game {
    internal BoardGame(int i) : base(i) {
    System.Console.WriteLine("BoardGame constructor");
    }
    }
    public class Chess : BoardGame {
    internal Chess() : base(11){
    System.Console.WriteLine("Chess constructor");
    }
    public static void Main() {
    Chess x = new Chess();
    }
    }///:~
    το παραδειγμά μου είναι μάλλον ατυχές πρέπει να βρω ένα άλλο επίσης δεν ξέρω να χρησιμοποιώ indexers πως μπορώ να βάλω στο  παράδειγμα με τη Shape2D?
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems