Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Pretezovani statickych metod

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Pretezovani statickych metod

Autor: Natix ♂

14:08:35 14.10.2012

Jasně, takže platí, že každý objekt, který je Solid, je zároveň i Measurable. To znamená, že do metody, která přijímá argument typu Measurable, můžeš předat i instanci typu Solid.

Problém nastává při přetěžování, protože máš 2 různé metody se stejným názvem a obě jsou schopné na vstupu přijmout objekt typu Measurable (protože Solid je zároveň i Measurable, jak jsme si řekli). Která z nich ale zavolá?

Odpověď je ta, která nejpřesněji odpovídá typu předávané proměnné. Takže pokud mám tyhle dvě metody:
static void printMeasurement(Measurable measurable) {} // pro přehlednost pojmenuju #1
static void printMeasurement(Solid solid) {} // a tuhle #2

a tyhle dvě proměnné:
Measurable m = ...
Solid s = ...

Tak platí, že:
printMeasurement(m); // volá #1
printMeasurement(s) // volá #2
Na tom není zas tak nic moc překvapivého.

------
No a teď to uděláme trochu zajímavější. Protože platí, že objekt instance Solid je zároveň i instancí Measurable, tak musí platit i to, že objekt v proměnné "s" musí být možné předat i do metody #1. Jak ale přebít mechanismus, který pro něj vždycky vyhodnotí jako správnou metodu #2?

Je třeba explicitně říct, že chci zpracovat objekt v proměnné "s" jako Measurable. Možnosti jsou dvě:
1) Přiřadit "s" do proměnné typu Measurable:
Measurable sAsMeasurable = s; // je možné z důvodu opakovaně řečeného výše
printMeasurement(sAsMeasurable); // zavolá #1

2) Anebo při volání cílové metody přetypovat předávaný objekt:
printMeasurement((Measurable) s); // zavolá #1

Citovat příspěvek

 

Re: Pretezovani statickych metod

Autor: Olej ♂

10:05:19 14.10.2012

Ano, máte pravdu

Citovat příspěvek

 

Re: Pretezovani statickych metod

Autor: Natix ♂

1:28:35 14.10.2012

Jaký je vztah mezi rozhraními Measurable a Solid? Tipoval bych, že Solid extends Measurable, je to tak?

Citovat příspěvek

 

Pretezovani statickych metod

Autor: Olej ♂

0:19:21 14.10.2012

Dobry den, nevim si rady s touto situaci:

Vytvořte třídu Gauger ("měřidlo") se dvěma statickými přetíženými metodami printMeasurement:

První metoda vezme libovolný měřitelný objekt (tj. libovolný objekt implementující rozhraní Measurable) a
a) na std. výstup vypíše informace o objektu, viz metoda toString(),
b) na další řádek vypíše "Perimeter: <n>", kde <n> je obvod.
Druhá metoda vezme libovolný celistvý objekt (tj. libovolný objekt implementující rozhraní Solid) a
a) na std. výstup vypíše informace o objektu, viz metoda toString(),
b) na další řádek vypíše "Perimeter: <n>", kde <n> je obvod objektu,
c) na další řádek vypíše "Area: <m>", kde <m> je obsah objektu.
Vyhněte se opakování kódu tím, že druhá variata metody bude volat tu první. Pozor ale, ať nevolá sebe sama. Došlo by k zacyklení (StackOverflowException).

Mam zatim toto, ale proste nevim jak mam volat ty metody, zkousel jsem to ruzne:
public class Gauger
{
public static void printMeasurement(Measurable mes) {
mes.toString(); //toString() je v jine tride tehoz balicku
System.out.println("Perimeter: " + mes.getLength()); // getLength() taktz...soucast rozhrani Measurable
}
public static void printMeasurement(Solid sol) {
sol.printMeasurement(new Measurable()); //jeden z mych pokusu
System.out.println("Area: " + sol.getArea()); // getArea() je v jine tride tehoz balicku..soucast rozhrani Solid
}
}
Dekuji za kazdou radu

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: