• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Konstruktory przy dziedziczeniu

VPS Starter Arubacloud
0 głosów
169 wizyt
pytanie zadane 21 maja 2017 w Java przez rubesom Obywatel (1,690 p.)

Cześć

Mam taki kod:

public class Kolo extends Figura
{
	
	private int zmienna;
	
	public Kolo ()
	{
		this(1);
	}
	
	public Kolo (int z)
	{
		zmienna = z;
	}
	
	public int getZmienna()
	{
		return zmienna;
	}
	
	public void setZmienna(int z)
	{
		zmienna = z;
	}

	public static void main(String[] args) 
	{
		
		Kolo kolo = new Kolo();
		kolo.setZmienna2(10);
		System.out.println(kolo.dodawanie());
		
		Figura figura = new Figura();
		figura.setZmienna2(10);
		System.out.println(figura.dodawanie());
		
	}

}

 

1. Czy muszę przerabiać konstruktory w podklasie? A może poprawnie jest tak jak wyżej, że korzystam z konstruktorów nadklasy czy powinno to wyglądać tak?:

	public Kolo ()
	{
		this(1);
	}
	
	public Kolo (int z)
	{
		this(z, 1);
	}
	
	public Kolo (int z, int y)
	{
		super(y);
		zmienna = z;
	}

 

2. Druga rzecz dotyczy wywoływania metody z nad klasy. Jak jest praktyczna różnica czy zrobię to z obiektem nadklasy czy podklasy?:
 

		Kolo kolo = new Kolo();
		kolo.setZmienna2(10);
		System.out.println(kolo.dodawanie());
		
		Figura figura = new Figura();
		figura.setZmienna2(10);
		System.out.println(figura.dodawanie());

 

komentarz 21 maja 2017 przez Wiciorny Ekspert (269,120 p.)
Obiektem podklasy nie wywolasz  metod klasy nadrzędnej, bo nie masz do niej dostępu.
komentarz 22 maja 2017 przez rubesom Obywatel (1,690 p.)

Mi jakimś sposobem to działa:

 
Kolo kolo = new Kolo();
kolo.setZmienna2(10);
System.out.println(kolo.dodawanie());
 

Czyli wywołałem metodę z nadklasy w podklasie, nie tak powinno działać dziediczenie?

1 odpowiedź

0 głosów
odpowiedź 21 maja 2017 przez Bartłomiej Łaski Mądrala (5,100 p.)

Siemka 

1. Nie wiem jak to jest w javie, ale w C# możesz wywołac coś takiego jak 

public Kolo (int z, int y) : base(y)
{
    zmienna = z;
}

2.

W tym przypadku Figura powinna być klasa abstrakcyjna, i wywołanie moim zdaniem powinno wygladac

Figura figura = new Kolo();

A dlaczego, ponieważ figura nie wiadomo czym jest, jest sobie jakims kształtem, i dopiero na podstawie klasy ktora po niej dziedzicy jesteśmy wstanie określić czym ten kształt jest.

komentarz 21 maja 2017 przez Wiciorny Ekspert (269,120 p.)
Figura figura = new Kolo();  // nie moze cos takiego byc 

 Klasy abstrakcyjne to, najogólniej, takie klasy dla których nie można stworzyć obiektu

 

Więc nie może być figura sobie klasy i dla niej tworzysz obiekt który jest Kołem :) 

komentarz 21 maja 2017 przez Bartłomiej Łaski Mądrala (5,100 p.)

No to teraz patrze :P 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    public abstract class Figura
    {

        public virtual void DodajRozmiar(int value)
        {
            Console.WriteLine("????");
        }

        public virtual void RysujFigure()
        {
            Console.WriteLine("????");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    public class Kolo : Figura
    {
        private int _rozmiar { get; set; }

        public Kolo(int rozmiar)
        {
            this._rozmiar = rozmiar;
        }

        public override void DodajRozmiar(int value)
        {
            _rozmiar += value;
        }

        public override void RysujFigure()
        {
            Console.WriteLine(_rozmiar);
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Kwadrat : Figura
    {
        public Kwadrat()
        {

        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            Figura figura = new Kolo(10);
            Figura figura2 = new Kwadrat();

            figura.RysujFigure();
            figura2.RysujFigure();

            Console.ReadKey();
        }
    }
}

Wykaz z kosoli screenshot

 

Z tego jasno widać ze klasa abstrakcyjna na podstawie klasy ktora dziedziczy po niej wie idelanie co to za klasa i jak ma ją wyswietlic, gdy zdeklarujemy odpowiednie metody w klasie abstakcyjnej i je przeciazymy w klasie potomnej.

komentarz 22 maja 2017 przez rubesom Obywatel (1,690 p.)

Czylil rozpatrywanie tego w tym kontekście:


 
Kolo kolo = new Kolo();
kolo.setZmienna2(10);
System.out.println(kolo.dodawanie());
 
Figura figura = new Figura();
figura.setZmienna2(10);
System.out.println(figura.dodawanie());
 

... nie ma sensu bo korzysta się z klas abstrakcyjnych/interfejsów i polimorfizmu?

 

komentarz 22 maja 2017 przez Bartłomiej Łaski Mądrala (5,100 p.)
Jeżeli masz tylko jedna figure w tym przypadku koło, to nie ma sensu. Ale jeżeli masz wiecej to ja bym proponował.
komentarz 22 maja 2017 przez rubesom Obywatel (1,690 p.)
W tym przykładzie metoda oblicz() jest w kalsie Figura, a widzę, że mogę jej użyć jako typ klasy Figura (nadklasa) jak i Kolo (podklasy). Jest jakaś praktyczn różnica w tym czy metodę wywołam na rzecz obiektu nadklasy czy podklasy?
komentarz 22 maja 2017 przez Bartłomiej Łaski Mądrala (5,100 p.)
W moim przypadku co wyzej podałem to jest klasa virtualna, przez to klasa ktora dziedziczy po klasie Figura wie jakiej metody może użyć, jeżeli jest w niej zaimplementowana a jak nie to . A w twoim przypadku jest to metoda odziedziczona popstu z klasy wyzej i jest ona publiczna. Wiec jak byś zrobic inna klase np Kwadrat i bedzie dziedziczyc po Figurze to tez bedzie mial dostep do tej metody. Czy mozesz dodac kod klasy Figura ?
komentarz 22 maja 2017 przez rubesom Obywatel (1,690 p.)

W klasie Figura nie ma cudów, zwykł kod do testów z jedną metodą:

public class Figura 
{
	private int zmienna2;
	
	public Figura()
	{
		this(1);
	}
	
	public Figura(int z2)
	{
		zmienna2 = z2;
	}
	
	public int getZmienna2()
	{
		return zmienna2;
	}
	
	public void setZmienna2(int z2)
	{
		zmienna2 = z2;
	}

	public double dodawanie()
	{
		return zmienna2 + zmienna2;
	}
	
	public static void main(String[] args) 
	{

	}

}

 

Podobne pytania

+1 głos
1 odpowiedź 218 wizyt
pytanie zadane 1 marca 2023 w C i C++ przez Pioterer Początkujący (280 p.)
0 głosów
0 odpowiedzi 82 wizyt
0 głosów
0 odpowiedzi 97 wizyt
pytanie zadane 26 kwietnia 2020 w PHP przez creend Gaduła (4,700 p.)

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...