Dziedziczenie a Konstruktory

2015-01-18 13:12
0

Uczę się javy i przerabiam tego typu przykład i naszła mnie taka myśl
Czy można odziedziczyć konstruktory czy jedynie wartości zmiennych?

public class Punkt{

    public static void main(String args[]){
        Punkt2D dwaD = new Punkt2D(2,8);
        Punkt2D dwaD1 = new Punkt2D();
        Punkt3D trzyD = new Punkt3D();      //**********************
        Punkt3D trzyD1 = new Punkt3D(2,5);//chodzi o tego typu obiekt 
                                           //**********************
        System.out.println("  x= "+dwaD.x+"  y= "+dwaD.y);
        System.out.println("  x= "+dwaD1.x+"  y= "+dwaD1.y);
        System.out.println("  x= "+trzyD.x+"  y= "+trzyD.y+"  z= "+trzyD.z);   
    }
}
class Punkt2D {
    int x;
    int y;
        public Punkt2D(){
            x=0;
            y=0;
        }
        public Punkt2D(int a, int b){
            x=a;
            y=b;
        }
}
class Punkt3D extends Punkt2D{
    int z;
    public Punkt3D(){
    z=5;
    }       
}
edytowany 4x, ostatnio: TomDom, 2015-01-18 13:13

Pozostało 580 znaków

2015-01-18 13:18
1

Nie można dziedziczyć konstruktorów. Klasa pochodna może natomiast w swoim konstruktorze wywołać konstruktor klasy bazowej poprzez super()

Pozostało 580 znaków

2015-01-18 13:25
0

A czy mógłbyś podać jakiś prosty przykład jak skorzystać z tych konstruktorów żeby nie trzeba było ich przepisywać??

        public Punkt2D(){
            x=0;
            y=0;
        }
        public Punkt2D(int a, int b){
            x=a;
            y=b;
        }

Pozostało 580 znaków

2015-01-18 13:41
class Punkt3D extends Punkt2D{
    int z;
     public Punkt3D(){
    super();
    //super(x, y);
    z=5;
    }       
}
edytowany 1x, ostatnio: Kamil9132, 2015-01-18 13:42

Pozostało 580 znaków

2015-01-18 14:03
2

Dziedziczenie Pinkt3D po Pinkt2D nie ma żadnego sensu, ponieważ praktycznie jedynie co da się wykorzystać to deklaracja dwóch zmiennych przy czym tego samego typu co ta trzecia potrzebna w Pinkt3D.
Więc jeżeli chodzi o jakąś oszczędność wiersza na deklaracje dwóch zmiennych to mamy wyłacznie straty.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-19 15:35
0

Zastanawiam się dlaczego nie można tak

class Punkt3D extends Punkt2D{
    int z;
     public Punkt3D(){
    super(x, y);//????????????????????????
    z=5;
    }       
}

Tylko trzeba tak?

class Punkt3D extends Punkt2D{
    int z;
     public Punkt3D(int x, int y){
    super(x, y);
    z=5;
    }       
}

Czy może jest jakiś sposób na to??

Pozostało 580 znaków

2015-01-19 15:41
0
class Punkt3D extends Punkt2D{
    int z;
     public Punkt3D(){
    super(x, y);//????????????????????????
    z=5;
    }       
}

A co to są x, y? Jakie mają wartości?
Zauważ, że to już jest ok (choć bez sensu):

class Punkt3D extends Punkt2D{
    int z;
     public Punkt3D(){
    super(234, 34);
    z=5;
    }       
}
edytowany 1x, ostatnio: twonek, 2015-01-19 15:43

Pozostało 580 znaków

2015-01-19 15:42
0

Tworząc obiekt klasy Punkt3D wywołujesz konstruktor tej klasy, klasa po której ta klasa dziedziczy nie ma żadnego wpływu na zmienne przekazywane do konstruktora klasy Punkt3D, tak więc w pierwszym przypadku nie przekazujesz w żaden sposób zmiennych x i y, oczywiście nie musisz ich przekazywać, tylko np. zadeklarować je wewnątrz klasy, jednak to w tym wypadku byłoby pozbawione sensu.

Pozostało 580 znaków

2015-01-19 15:48
0

Tak to powinno wyglądać technicznie:

class Punkt2D
  {
   protected int x,y;
   public Punkt2D() { x=y=0; }
   public Punkt2D(int px, int py)
     {
      x=px;
      y=py;
     }
  }

class Punkt3D extends Punkt2D
  {
   protected int z;
   public Punkt3D()
     {
      super();
      z=0;
     }       
   public Punkt3D(int px, int py,int pz)
     {
      super(px,py);
      z=pz;
     }       
  }

Zaś praktycznie - powtarzam jeszcze raz to dziedziczenie nie ma żadnego sensu.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-19 16:06
0

Właśnie widzę że to nie ma sensu i dlatego się zastanawiam po co stosować konstrukcję super(); ??
skoro i tak praktycznie muszę tworzyć od nowa praktycznie identyczny konstruktor.

edytowany 1x, ostatnio: TomDom, 2015-01-19 16:06
Nie ma sensu to konkretne dziedziczenie czyli Pinkt3D po Pinkt2D. - _13th_Dragon 2015-01-19 16:42

Pozostało 580 znaków

2015-01-19 16:17
tk
0
  1. Po to aby sie nie powtarzac - jezeli z klasy bazowej dziedziczy wiele klas to wyobraz sobie, ze do klasy bazowej dopisujesz jakies pole, ktore wymaga inicjalizacji. Musialbys wtedy poszukac kazda klase pochodna i inicjalizowac wszedzie pole z klasy bazowej - nie ma to kompletnie sensu i tylko komplikuje sprawe.
  2. Po to aby zainicjalizowac pola, ktore w klasie bazowej sa prywatne. Klasa pochodna nie ma dostepu do pol prywatnych klasy bazowej. Oczywiscie jezeli klasa bazowa posiada metody dzieki ktorym mozna zainicjalizowac prywatne pola to nie ma z tym problemow (o ile metody nie sa prywatne) ale nie zawsze tak musi byc.
edytowany 3x, ostatnio: tk, 2015-01-19 16:22

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0