Implementace rozhraní v Javě

Elka

Implementace rozhraní v Javě
« kdy: 13. 07. 2017, 07:44:25 »
Řekněme že mám nějaké rozhraní "A" v němž je deklarována metoda "a". Dále mám rozhraní "B" v němž je deklarována metoda "a" s úplně stejnou signaturou jako v metodě "a" z rozhraní "A". Obě tyto metody však slouží k naprosto jinému účelu a nijak spolu nesouvisí. Teď si chci definovat třídu, která bude implementovat obě tyto rozhraní-půjde to?


gll

Re:Implementace rozhraní v Javě
« Odpověď #1 kdy: 13. 07. 2017, 08:04:54 »
Nebylo by jednodušší to vyzkoušet nebo vygooglit?

Re:Implementace rozhraní v Javě
« Odpověď #2 kdy: 13. 07. 2017, 08:16:29 »
Řekněme že mám nějaké rozhraní "A" v němž je deklarována metoda "a". Dále mám rozhraní "B" v němž je deklarována metoda "a" s úplně stejnou signaturou jako v metodě "a" z rozhraní "A". Obě tyto metody však slouží k naprosto jinému účelu a nijak spolu nesouvisí. Teď si chci definovat třídu, která bude implementovat obě tyto rozhraní-půjde to?
Půjde. Ale dej si pozor ať lidé co po tobě ten kód převezmou neví kde bydlíš.

gll

Re:Implementace rozhraní v Javě
« Odpověď #3 kdy: 13. 07. 2017, 08:29:16 »
Půjde. Ale dej si pozor ať lidé co po tobě ten kód převezmou neví kde bydlíš.

Co je na tom špatně?

dustin

Re:Implementace rozhraní v Javě
« Odpověď #4 kdy: 13. 07. 2017, 08:35:10 »
Jak určí, kterou z těch dvou metod s různou funkcionalitou ale stejnou signaturou má volající kód zrovna na mysli?


gll

Re:Implementace rozhraní v Javě
« Odpověď #5 kdy: 13. 07. 2017, 08:41:16 »
Jak určí, kterou z těch dvou metod s různou funkcionalitou ale stejnou signaturou má volající kód zrovna na mysli?

Implementace je jen jedna. Nic určovat nemusí.

dustin

Re:Implementace rozhraní v Javě
« Odpověď #6 kdy: 13. 07. 2017, 08:46:29 »
Implementace je jen jedna. Nic určovat nemusí.

Samozřejmě, jenže tazatel specifikuje "Obě tyto metody však slouží k naprosto jinému účelu a nijak spolu nesouvisí". Jak se v té jedné metodě rozhodne, který z těch dvou účelů zrovna nastal?

gll

Re:Implementace rozhraní v Javě
« Odpověď #7 kdy: 13. 07. 2017, 09:03:48 »
Implementace je jen jedna. Nic určovat nemusí.

Samozřejmě, jenže tazatel specifikuje "Obě tyto metody však slouží k naprosto jinému účelu a nijak spolu nesouvisí". Jak se v té jedné metodě rozhodne, který z těch dvou účelů zrovna nastal?

To nejde. Metoda musí být stejná. Podlešák tvrdí, že to jde, ale je to špatně. Podle mě, když mohu použít stejnou metodu, není na tom nic špatně. Když nemohu, tak to nejde.

dustin

Re:Implementace rozhraní v Javě
« Odpověď #8 kdy: 13. 07. 2017, 09:11:16 »
Jde to mraky způsoby, ale všechny jsou ukrutné prasárny vyžadující spolupráci volajícího kódu - ThreadLocal, nastavení nějaké vnější proměnné atd. atd. Kamil má pravdu, kdo to tak hloupě navrhne, že se bude muset dělat taková čuňárna, zaslouží pověsit do průvanu.

haha

Re:Implementace rozhraní v Javě
« Odpověď #9 kdy: 13. 07. 2017, 09:17:20 »
V Javě prostě implementujes jednu z těch metod -- V C# můžeš využít explicitní implementaci ... takže můžeš implementovat obě,ale uvedes i název rozhraní.

Re:Implementace rozhraní v Javě
« Odpověď #10 kdy: 13. 07. 2017, 09:21:32 »
Jde to mraky způsoby, ale všechny jsou ukrutné prasárny vyžadující spolupráci volajícího kódu - ThreadLocal, nastavení nějaké vnější proměnné atd. atd. Kamil má pravdu, kdo to tak hloupě navrhne, že se bude muset dělat taková čuňárna, zaslouží pověsit do průvanu.
A to je ještě v případě, že si dá práci implementovat obě možné sémantiky. V praxi je se spíš stane, že implementátor implementuje jen jednu konkrétní variantu (třeba A). Za rok pak někdo instanci takové třídy dostane jako parametr typu B... a nestačí se divit.

Naštěstí to není tak časté, většinou když dojde ke konfliktu názvů s odlišnou sémantikou, liší se i parametry nebo návratová hodnota. Takže bych se spíš podíval kde se takové dvě rozhraní vzala, tohle docela smrdí.

Re:Implementace rozhraní v Javě
« Odpověď #11 kdy: 13. 07. 2017, 09:24:38 »
Implementace je jen jedna. Nic určovat nemusí.

Samozřejmě, jenže tazatel specifikuje "Obě tyto metody však slouží k naprosto jinému účelu a nijak spolu nesouvisí". Jak se v té jedné metodě rozhodne, který z těch dvou účelů zrovna nastal?

O implementaci se stara trida, ktera implementuje rozhrani. Ta proste udela, co ma v dane metode naimplementovane. Takze je to na Tobe co to udela. Interface jen rekne, jake dana metoda ma jmeno, jake parametry a co vrati.

Pokud ma kazda metoda jiny navratovy typ, tak se to neprelozi.

Pokud jeden s interface tu metodu implementuje jako default function v danem interface, tak ji MUSIS stejne implementovat v te Tride. Nevyuzije se implementace z interface.

Rozhodne bych to nedelal. Pouzit jednu implementacni tridu na vice rozhani doporucuji jen v extremnich pripadech,

treba kdyz chces, aby byl objekt dane tridy serializovatelny a zaroven implementoval nejaky jiny interface

public class Ddd implements Serializable, Ccc { ....

dalsi varianta je, ze dany objekt neni immutable a potrebujes napriklad opet serializaci

public class Fff implements Cloneable, Serializable { ....

Misto implementace dvou interface v jedne tride bych vetsinou implementoval dve tridy, kazda by implementovala jeden interface a pak bych vytvoril tridu, ktera ma oba interface jako parametry konstruktoru, pokud by tam byl duvod tridy pouzivat spolecne.


btw. dobry programator se pozna, ze sna spoustu pravidel a vi kdy je ma porusit ;)

gll

Re:Implementace rozhraní v Javě
« Odpověď #12 kdy: 13. 07. 2017, 09:24:44 »
Takže bych se spíš podíval kde se takové dvě rozhraní vzala, tohle docela smrdí.

mohou být ze dvou nesouvisejících knihoven.

dustin

Re:Implementace rozhraní v Javě
« Odpověď #13 kdy: 13. 07. 2017, 09:32:57 »
Naštěstí to není tak časté, většinou když dojde ke konfliktu názvů s odlišnou sémantikou, liší se i parametry nebo návratová hodnota.

A proto čím dřív přijde java s value types, tím líp. Co nejkonkrétnější a nejužší specifikace typu zabrání mnoho chybám.

dustin

Re:Implementace rozhraní v Javě
« Odpověď #14 kdy: 13. 07. 2017, 09:34:36 »
mohou být ze dvou nesouvisejících knihoven.

Pak se musí implementovat v různých třídách a spojit to třeba kompozicí, jak popisuje Zdenek Henek.