Třídy a dědičnost – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Třídy a dědičnost – Java – Fórum – Programujte.comTřídy a dědičnost – Java – Fórum – Programujte.com

 

dawnMist0
Newbie
24. 10. 2012   #1
-
0
-

Ve škole jsem dostal následující zadání a potřebuju trochu nakopnout.

Vytvořte třídu GeneralRegularPolygon implementující rozhraní RegularPolygon a Colored. Tato třída pak bude sloužit jako společná nadtřída pro všechny pravidelné n-úhelníky.

Pravidelný n-úhelník je definovám svým středem a počtem a délkou hran. Konstruktor proto bude mít právě tyto tři parametry (v uvedeném pořadí). Implicitní barva je bílá ("white").

public class GeneralRegularPolygon implements RegularPolygon, Colored
{
    private int numEdges;
    private double edgeLength;
    private String color = "white";    private Vertex2D center;
    private double radius;

    public int getNumEdges() {
        return numEdges;
    }
    
    public double getEdgeLength() {
        return edgeLength;
    }

    public Vertex2D getCenter() {
        return center;
    }
    
    public String getColor() {
        return color;
    }
    
    public void setColor(String color) {
        this.color = color;
    }
    
    public GeneralRegularPolygon(Vertex2D center, int numEdges, double edgeLength) {
        this.center = center;
        this.numEdges = numEdges;
        this.edgeLength = edgeLength;
    }

Vytvořte třídu RegularOctagon pro pravidelný osmiúhelník rozšiřující GeneralRegularPolygon.

Tady tápu. Jak mám vytvořit třídu pro pravidelný osmiúhelník? Když napíšu něco jako:

public class RegularOctagon extends GeneralRegularPolygon
{
    public RegularOctagon(Vertex2D center, int numEdges, double edgeLength) {
        super(center, numEdges, edgeLength);
    }
}

tak to sice zkompiluju, ale nedává mi to smysl, protože počet hran je pro osmiúhelník přece jasně 8. :-)

Jak mám vytvořit tu druhou třídu, aby dědila pouze střed a délku hran a počet hran mělo svůj vlastní?

Díky za odpovědi.

Nahlásit jako SPAM
IP: 88.102.2.–
liborb
~ Redaktor
+18
Guru
24. 10. 2012   #2
-
0
-

Konstruktor osmiúhelníku už nebude mít parametr počet hran, ale základní třídě bude předávat číslo 8 jako počet hran.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 82.145.208.–
dawnMist0
Newbie
24. 10. 2012   #3
-
0
-

Když konstruktor osmiúhelníku nemá tři parametry, tak vyskočí error: GeneralRegularPolygon cannot be applied to given types.

Nahlásit jako SPAM
IP: 88.102.2.–
dawnMist0
Newbie
24. 10. 2012   #4
-
0
-

Já samozřejmě chápu, že to můžu napsat takto:

public RegularOctagon(Vertex2D center, int numEdges, double edgeLength) {
        super(center, 8, edgeLength);
}

Ale rád bych věděl, zda-li tady můžu vytvořit konstruktor pouze se dvěma parametry (center, edgeLength)?

Nahlásit jako SPAM
IP: 88.102.2.–
ingiraxo+15
Grafoman
24. 10. 2012   #5
-
0
-

#4 dawnMist
jasně, proč bys nemohl? je to normální další třída, která dědí hlavní, kde už jsou nějaký konstruktory a v aktuální třídě budou specifický konstruktory/funkce apod. pro aktuální třídu

akorát je tak trochu podmínka nebo by aspon bylo vhodný zajistit, aby se vždy initializovaly všechny instanční promenný z rodičovský trídy

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
dawnMist0
Newbie
24. 10. 2012   #6
-
0
-

Aha, už to zřejmě chápu. Já to vlastně můžu napsat takto:

public RegularOctagon(Vertex2D center, double edgeLength) {
        super(center, 8, edgeLength);
}

A tím ten konstruktor překryju nebo jak se tomu nadává, že?

Každopádně děkuju oběma za pomoc!

Nahlásit jako SPAM
IP: 88.102.2.–
ingiraxo+15
Grafoman
24. 10. 2012   #7
-
0
-

nic nepřekryjes, prostě vytvoříš další.. aby si ho překryl, tak musí mít stejný parametry i počet

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
dawnMist0
Newbie
25. 10. 2012   #8
-
0
-

Ok, díky.

Ještě jedna věc. Pokud chci použít například private double radius z nadtřídy GeneralRegularPolygon v podtřídě Circle, jak to udělat?

Chápu správně, že private atributy nemůžu v podtřídě používat a musím je tam dostat pomocí nějaké metody?

Nahlásit jako SPAM
IP: 88.102.2.–
ingiraxo+15
Grafoman
25. 10. 2012   #9
-
0
-

místo private použij protected

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
dawnMist0
Newbie
25. 10. 2012   #10
-
0
-

To bohužel nemáme povoleno.

Nahlásit jako SPAM
IP: 88.102.2.–
sleepy0
Stálý člen
25. 10. 2012   #11
-
0
-

tak dopis do GeneralPublicPoligonu metodu ktora preda radius.

class GeneralPublicPoligon{
	// strudle kodu
	// ...
	protected double getRadius(){
		return this.radius;
	}
}
Nahlásit jako SPAM
IP: 158.195.195.–
ingiraxo+15
Grafoman
25. 10. 2012   #12
-
0
-

cože? nemáte povoleno protected? co to je za labilního učitele? :D to je základ... v každým případě pokud nemáte vůbec povolenej modif. protected, tak musíš udělat veřejnej getter na tu proměnnou, ale bude pak přístup i z venku (což nevim jestli je účel)

edit: podstatě to co udělal sleepy, akorát dáš public

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
dawnMist0
Newbie
25. 10. 2012   #13
-
0
-

Prozatím po nás chcou, aby atributy byly vždycky private.

S tím poloměrem jsem to vyřešil tak, že jsem tam prostě přidal ještě jeden.

Anyway - snad už poslední dotaz. Jak by bylo možný použít metodu z podtřídy v nadtřídě?

GeneralRegularPolygon - nadtřída, Circle - podtřída s metodou getHeight():

public double getHeight() {
    return 2 * Circle.getRadius();
}
Nahlásit jako SPAM
IP: 88.102.2.–
liborb
~ Redaktor
+18
Guru
25. 10. 2012   #14
-
0
-

Používej, prosím, zavedené názvosloví rodičovská třída apod. Jinak základní třída o svých potomcích nic neví, takže to lze jedině za použití polymorfismu, tj. rodičovská třída definuje nějakou virtuální metodu a její potomci ji znovu implementují.

Nahlásit jako SPAM
IP: 188.75.135.–
dawnMist0
Newbie
25. 10. 2012   #15
-
0
-

No, zkusil jsem to nějak takto:

public class GeneralRegularPolygon {
    private Vertex2D center;
    private double radius;
    private int numEdges;
    private double edgeLength;

    public double getRadius() {
        return (edgeLength)/(2 * Math.sin(Math.PI/numEdges));
    }

    public double getHeight() {
        return 2 * getRadius();
    }
    
    public double getWidth() {
        return 2 * getRadius();
    }
}

public class Circle extends GeneralRegularPolygon {
    private double radius;

    public double getRadius() {
        return this.radius;
    }
}

A ve třídě Circle bych potřeboval, aby zděděné metody getHeight() a getWidth() používaly metodu getRadius třídy Circle, ale zároveň je tam nemůžu ze zadání znovu napsat. Takže mně to vůbec nedává smysl.

Nahlásit jako SPAM
IP: 88.102.2.–
ingiraxo+15
Grafoman
25. 10. 2012   #16
-
0
-

#15 dawnMist
na tvém míste bych se vykašlal co říká učitel a použij u rodičovské třídy protected u radiusu.. tak se to i běžně dělá, protože takto máš naprosto stejný instanční proměnný a úplmě dědičnost ztrácí smysl

pro ten problém s Circle budeš potřebovat nějaký rozhrní, případně abstraktní třídu, která bude základní pro všechny odvozený a funkce budeš akorát přepisovat v potomcích - v podstatě to, co psal libor

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
liborb
~ Redaktor
+18
Guru
25. 10. 2012   #17
-
0
-

Pokud by to bylo na mě a měl jsem takové omezení, tak bych getRadius do Polygonu vůbec nedával. Podle mě by bylo lepší implementovat metody getHeight a getWidth znovu v třídě Circle. 

Nahlásit jako SPAM
IP: 188.75.135.–
ingiraxo+15
Grafoman
25. 10. 2012   #18
-
0
-

menší ukázka

// bazova trida pro circle - predpis, co musi obsahovat vsechny verze circle
public abstract class CircleBase {

    // "musi" byt protected, aby potomci mohli pristupovat k teto promenne
    protected double radius;

    // zakladni konstruktor - tento konsturktor musi vsichni potomci podedit
    public CircleBase(double radius) {
        this.radius = radius;
    }

    // getter radius
    public double getRadius() {
        return radius;
    }

    // setter radius
    public void setRadius(double radius) {
        this.radius = radius;
    }
}

// normalni trida pro circle, co vychazi z basovy tridy
public class Circle extends CircleBase {

    // pridava vlastnost barvy (opet protected pro dalsi potomky)
    protected Color color;

    // MUSI zdedit konstruktor z basovy tridy cicle
    public Circle(double radius) {
        super(radius);
    }

    // vlastni konstruktor jen pro cicle - pridava barvu
    public Circle(double radius, Color color) {
        this(radius);
        this.color = color;
    }

    // opet getter pro barvu
    public Color getColor() {
        return color;
    }

    // a setter pro barvu
    public void setColor(Color color) {
        this.color = color;
    }

    // prepisuju z basovy tridy
    @Override
    public double getRadius() {
        return super.getRadius();
    }

    // prepisuju z basovy tridy
    @Override
    public void setRadius(double radius) {
        super.setRadius(radius);
    }
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
dawnMist0
Newbie
25. 10. 2012   #19
-
0
-

Já vám tady ty svoje úkoly drobím po kouskách, protože se to sám snažím pochopit. Nicméně možná bude lepší, když to budete znát celé. Každopádně getRadius v Polygonu být musí, je předepsána rozhraním.

Vytvořte třídu GeneralRegularPolygon implementující rozhraní RegularPolygon a Colored. Tato třída pak bude sloužit jako společná nadtřída pro všechny pravidelné n-úhelníky.
        Pravidelný n-úhelník je definovám svým středem a počtem a délkou hran. Konstruktor proto bude mít právě tyto tři parametry (v uvedeném pořadí). Implicitní barva je bílá ("white").
        Poloměr opsané kružnice se vypočítá jako:
        r = s / (2 * sin(PI/n)),
        kde s je délka hran a n je počet hran.
        Obsah pravidelného n-úhelníka:
        S = 0.5 * (n * r * r * sin(PI/n)),
        kde r je poloměr opsané kružnice a n je počet hran.
        Šířka a výška pravidelného n-úhelníka se pro jednoduchost spočítá jako průměr opsané kružnice.
        Potřebné matematické funkce a konstanty naleznete ve třídě java.lang.Math.
        Metoda toString bude vracet "<n>-gon: center=[<center>], edge length=<length>, color=<color>", kde <n> je počet hran, <center> jsou souřadnice středu, <length> je jejich délka a <color> je barva.
    Vytvořte třídu RegularOctagon pro pravidelný osmiúhelník rozšiřující GeneralRegularPolygon.
    Upravte třídu Circle tak, aby rozšiřovaly třídu GeneralRegularPolygon.
        Počet hran kružnice je maximální celé číslo, tj. Integer.MAX_VALUE.
        Délka hran kružnice je 0.
        Zděděná metoda getRadius() by pro naši kružnici nefungovala, protože délka hran je 0. Proto si třída musí poloměr pamatovat v atributu a metodu překrýt.
        Výpočet obvodu a obsahu bude rovněž překryt. Obě hodnoty se budou počítat původními vzorci pro kruh, nikoliv obecnými vzorci pro pravidelný n-úhelník.
        Zrušte ve třídě všechny atributy, které jsou již definovány v nadtřídě. Rovněž smažte překryté metody, které přebíráme beze změny.

Nahlásit jako SPAM
IP: 88.102.2.–
sleepy0
Stálý člen
25. 10. 2012   #20
-
0
-

Uz som ti to napisal v tom GeneralRegularPolygon mas metodu getRadius() takze v oktagone nic nevymyslaj.

A teraz pre ten kruh vytvoris nieco ako:

class Circle exends GeneralRegularPolgon{
	private double radius;

	public Circle(Vertex pos, double radius){
		super(pos, Integer.MAX_VALUE, 2*radius*Math.sin(Math.PI/Integer.MAX_VALUE));
		this.radius = radius;
	}

	//... kod
	public double getRadius(){
		return this.radius;
	}
}
Nahlásit jako SPAM
IP: 158.195.195.–
dawnMist0
Newbie
25. 10. 2012   #21
-
0
-

No jasně! Já v tom konstruktoru pořád němel ten poloměr. Mockrát děkuju.

Nahlásit jako SPAM
IP: 88.102.2.–
ingiraxo+15
Grafoman
25. 10. 2012   #22
-
0
-

ach jo, trída Circke nemá mít další inst. proměnnou radius... tu už obsahuje rodičovská.. nikde nemáš napsaný, že vždy má být všechno private a protected jste museli brát ještě předtim, než jste začli dědit.. nebo si nedával pozor.. krom toho není nutný, aby třída circle obsahovala další radius

pokud vytvoříš instanci Circle, tak radius bude automaticky pro circle a ve třídě circle přepíšeš get a set radiusu, kde nastavíš vlastní tělo specifický pro circle

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
dawnMist0
Newbie
25. 10. 2012   #23
-
0
-

Ano, už to chápu, mockrát děkuju za trpělivost.

Nahlásit jako SPAM
IP: 88.102.2.–
liborb
~ Redaktor
+18
Guru
25. 10. 2012   #24
-
0
-

Zděděná metoda getRadius() by pro naši kružnici nefungovala, protože délka hran je 0. Proto si třída musí poloměr pamatovat v atributu a metodu překrýt.

Z toho mi jasně vychází, že členskou proměnnou radius neobsahuje GeneralRegularPolygon, ale až Circle. Dokonce ji ani v GeneralRegularPolygon nikde nepoužíváš. Důležité je splnit zadání (a samozřejmě to chápat), protože hodnotit tě bude učitel a nikoliv účastníci tohoto fóra :).

Nahlásit jako SPAM
IP: 188.75.135.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý