Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Višestruko nasleđivanje u Javi

[es] :: Java :: Višestruko nasleđivanje u Javi

[ Pregleda: 6099 | Odgovora: 19 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.adsl.zonnet.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Višestruko nasleđivanje u Javi10.12.2003. u 22:21 - pre 247 meseci
Možda glupo pitanje, ali svejedno ide: zašto u Javi ne postoji višestruko nasleđivanje? I, naravno, koji je najbolji način za simulaciju višestrukog nasleđivanja?

f
 
Odgovor na temu

-zombie-
Tomica Jovanovic
freelance programmer
ni.ac.yu

Član broj: 4128
Poruke: 3448
*.InfoSky.Net

Sajt: localhost


+5 Profil

icon Re: Višestruko nasleđivanje u Javi11.12.2003. u 05:23 - pre 247 meseci
java je pravljena da pojednostavi c++. višestruko nasleđivanje i najveći c++ majstori priznaju da su koristili jednom ili ni jednom u životu (a pitanje i da li je i tada bilo neophodno ;)

to je zato što MI može da bude nezgodno. java ima malo drugačiju filozofiju. ima interfejse (totalno apstraktne klase), i svaka klasa može da nasledi tačno jednu klasu i da implementira neograničen broj interfejsa.

citat iz knjige Bruce Eckela "Thinkin In Java" (drugo izdanje), 7. poglavlje "polimorfizam", naslov "multiple inheritance in java". (knjiga dostupna u pdf formatu sa autorovog sajta)
Citat:

The interface isn't simply a "more pure" form of abstract class. It has a higher purpose than that. Because an interface has no implementation at all -- that is, there is no storage associated with an interface -- there is nothing to prevent many interfaces from being combined. This is valuable because there are times when you need to say "An x is an a and a b and a c". In C++, this act of combining multiple class interfaces is called multiple inheritance, and it carries some rather sticky baggage because each class can have an implementation. In Java, you can perform the same act, but only one of the classes can have an implementation, so the problems seen in C++ do not occur with Java when combining multiple interfaces.


i dok MI u c++ retko ko i koristi, u javi se interfejsi koriste svakodnevno. pomalo kao odnos SGMLa i XMLa. prvi je moćniji, ali široku upotrebu je dobio tek mlađi i prostiji brat ;)


btw, bilo je već nekoliko rasprava na ovu temu, valjda u Art of Programming, pograži ;)
 
Odgovor na temu

sspasic
Sasa Spasic

Član broj: 3261
Poruke: 175
*.medianis.net

Jabber: sspasic@elitesecurity.org
ICQ: 35454521


Profil

icon Re: Višestruko nasleđivanje u Javi11.12.2003. u 06:32 - pre 247 meseci
Nedostatak MI se moze prevazici delegiranjem.

Problem je sto delegacija ne moze da zameni potpuno nasledjivanje posto se gubi
polimorfizam sa strane klase koja nije nasledjena vec delegirana.
I ovo se dosta cesto, kada je neophodno, moze prevazici doslednom primenom
'programiranja prema interfejsu'. Npr. i bazna i izvedena klasa implementiraju
isti interfejs (interfejse) a ostatak programa se objektima tih klasa obraca iskljucivo
prema interfejsu.

Inace, sa onim da je MI nepotrebno se ne slazem.
Jeste da je skoro uvek dovoljno jedan ili vise intefejsa + jedna apstraktna klasa
(u C++-u je ovo MI). Medjutim, kao i neke druge stvari u C++-u (RTTI, na primer)
veoma retko zatreba ali kad zatreba veoma je dosadno raditi na drugi nacin,
iako je to, naravno, uvek moguce.

Uz to, postoje jos par dobrih razloga zasto MI moze da bude korisno.
Npr. moguce je praviti interfejse koji proveravaju pre i post conditions.
Dodatno, uz sablone MI pruza neke interesantne mogucnosti.

Od losih strana - naivna upotreba MI zacas dovede do nepotrebno komplikovanog dizajna.
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Višestruko nasleđivanje u Javi11.12.2003. u 08:52 - pre 247 meseci
Šta onda treba koristiti kada se želi višestruko nasleđivanje? Izmuntao sam ovo što sledi. Jedino što to znači da moram za svaku klasu koja koristi MI da pravim ovaj mehanički deo u kome se izvodi delegacija. Može li to nekako bolje?

Code:

public class C1 {
    // some methods
}

public interface I2 {
    // define interface
    public void proc();
    public void proc2();
}

public class C2 implements I2 {
    public void proc () {
    // does something
    }
    public void proc2 () {
    // does something 2
    }
}

public class C3 extends C1 implements I2 {
    private C2 c2;
    public void proc() {
    c2.proc();
    }
    public void proc2() {
    c2.proc2();
    }
}

 
Odgovor na temu

Java Beograd
Novi Beograd

Član broj: 11890
Poruke: 9506
*.yubc.net



+10254 Profil

icon Re: Višestruko nasleđivanje u Javi11.12.2003. u 09:13 - pre 247 meseci
Pa sad ... To što si napisao, to je to. Naravno, očigledno je ružno (u objektnom smislu) do zla boga. Tim pre što bi čak morao da kreiraš instancu klase C2 unutar C3. Možda može i malo drugačije, ali otrpilike jednako ružno. (Uvek će se naći programer koji bi to uradio drugačije)

Pitanje je, međutim, kako si došao do toga da ti treba višestruko nasleđivanje. Da li možda nešto što je već napisano u C++ pokušavaš da prebaciš u Javu ? Ili je to neki novi projekat. Ako je ono prvo, nema ti pomoći, snalazi se. Ako je drugo, mislim da bi valjalo preispitati objektni model.

Uzgred, ideja interface-a u Javi je nešto kao "posedovanje funkcionalnosti".
Na primer: Klasa B je vrste A ali ima funkcionalnost interfejsa I.


OTPOR blokadi ulica, OTPOR blokiranom Beogradu, OTPOR blokiranoj Srbiji
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Višestruko nasleđivanje u Javi12.12.2003. u 17:42 - pre 247 meseci
Koliko sam ukapirao, MI je nezgodno izvesti u jezicima koji imaju "single-rooted" objektni model. Kad god bi uveo višestruko nasleđivanje, morao bi da vodiš računa da se javljaju (najmanje) dve instance Object-a - tzv "diamond of death".

 
Odgovor na temu

-zombie-
Tomica Jovanovic
freelance programmer
ni.ac.yu

Član broj: 4128
Poruke: 3448
*.InfoSky.Net

Sajt: localhost


+5 Profil

icon Re: Višestruko nasleđivanje u Javi13.12.2003. u 02:55 - pre 247 meseci
da. vrlo logično. kako se ja toga nisam setio :-P

nego ozbiljno, oduvek sam se pitao šta je to loše u single-rooted objektnim modelima, tj još više sam se pitao zašto c++ ne prati takav dizajn, pošto mi se činio potpuno logičnim i samo sa prednostima, a nisam video ni jednu manu...

izgleda da je MI (bar) jedan od razloga. jel zna još neko neki razlog?
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
..g-c5300-4.dialup.nethere.net



+6 Profil

icon Re: Višestruko nasleđivanje u Javi13.12.2003. u 03:25 - pre 247 meseci
Evo šta kaže čiča-Bjarne na tu temu (The C++ Programming Language p732)

Citat:

A class hierarchy expresses relationships between its classes and a class represents a concept. Now, what is the common relationship between a smile, the driver for my CD-ROM reader, a recording of Richard Strauss' Don Juan, a line of text, a satelite, my medical records, and a real-time clock? Placing them all in a single hierarchy when their only shared property is that they are programming artifacts (they are all "objects") is of little fundamental value and can cause confusion. Forcing everything into a single hierarchy can introduce artificial similarities and obscure real ones. A hierarchy should be used only if analysis reveals conceptual commonality or if design and programming discover useful commonality in the structures used to implement the concepts. In the latter case, we have to be very careful to distinguish genuine commonality (to be reflected as subtypimg by public inheritance) and useful implementation simplifications (to be reflected as private inheritance).

 
Odgovor na temu

-zombie-
Tomica Jovanovic
freelance programmer
ni.ac.yu

Član broj: 4128
Poruke: 3448
*.dial.InfoSky.Net

Sajt: localhost


+5 Profil

icon Re: Višestruko nasleđivanje u Javi13.12.2003. u 05:06 - pre 247 meseci
osećam da će sada neko da kaže "ko sam ja, mali i ubogi zombie da preispitujem reči velikog Bjarna", ali mene nije ubedio ovim citatom..

prvo, pitao sam uglavnom za tehničke razloge zbog kojih single-root model nije dobar. koliko vidim, u ovom citatu nije dat ni jedan.

glavni razlog je što bi to moglo da bude zbunjujuće, što mi se čini pomalo smešno. taj ko može da shvati teoriju objektnog programiranja će se zbuniti što su svi objekti automatski (znači čak ni ne mora ručno to da deklariše) naslednici jedne klase? ma daj..

i na kraju, mislim da izjavom they are all "objects" sam sebe demantovao. pa prva stvar koja se objašnjava kada se uči objektna filozofija je značenje IS relacije, kao u rečenici "dog IS an animal". kada nešto JESTE nešto drugo, onda znači da ima sve osobine kao to drugo, i da treba da ga nasledi...

 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.telia.com

Sajt: dejan.lekic.org


+2 Profil

icon Re: =?UTF-8?B?VmnFoWVzdHJ1a28gbmFzbGXEkWl2YW5qZSB1IEphdmk=?=17.12.2003. u 16:47 - pre 247 meseci
Da, ali ispod haube se visestruko nasledjivanje svakako krije, tako da
mozda programeri nisu koristili, ali koriste svaki dan kad koriste
"najobicnije" stream klase...

Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

sspasic
Sasa Spasic

Član broj: 3261
Poruke: 175
*.medianis.net

Jabber: sspasic@elitesecurity.org
ICQ: 35454521


Profil

icon Re: Višestruko nasleđivanje u Javi17.12.2003. u 19:07 - pre 247 meseci
Citat:
-zombie-:
nego ozbiljno, oduvek sam se pitao šta je to loše u single-rooted objektnim modelima, tj još više sam se pitao zašto c++ ne prati takav dizajn, pošto mi se činio potpuno logičnim i samo sa prednostima, a nisam video ni jednu manu...

izgleda da je MI (bar) jedan od razloga. jel zna još neko neki razlog?


Verovatno ces odgovor na ovo pitanje dobiti ako se upitas:
'A da li mi nedostaje to sto C++ nema "single-rooted" objektni model'?

Iskreno, meni ne nedostaje.
Mislim da je IS A relacija korisna samo ako se koristi u programu. Npr. dog IS An animal. Ali ako program nista posebno ne radi sa zivotinjama, niti ima neke koristi u tome sto sve zivotinje dele neke iste atribute - nema ni razloga da se ovo opise nasledjivanjem.

U Javi je cinjenica da sve klase implicitno nasledjuje klasu Object korisna verovatno zbog interne implementacije JVM a to sto je ta cinjenica vidljiva programeru dovelo je do nekih cudnih odluka u dizajnu drugih stvari - na primer kolekcija.
Doduse, imam utisak da bi neki napredniji mehanizmi bili komplikovaniji da ne moze da se iskoristi cinjenica da su svi objekti instance klasa izvedenih iz Object. Ovde mislim uglavnom na razne mehanizme za distribuirano programiranje i na 'reflection'.

Inace, C++ ima mehanizam za prevazilazenje onog diamond of death (ako dobro razumem na sta se pojam odnosi) - virtuelno nasledjivanje. Naravno, po cenu performansi.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Višestruko nasleđivanje u Javi18.12.2003. u 21:16 - pre 247 meseci
Da, dobro si shvatio. Međutim, kod C++a često ne moraš da koristiš virtuelno nasleđivanje, baš iz razloga što mu objektni model nije "single-rooted". Ako pogledaš kako recimo Alexandrescu koristi višestruko nasleđivanje, videćeš da su baze male specijalizovane template klase (tzv "policies") koje nemaju zajednički "koren" i koje se onda kombinuju višestrukim nasleđivanjem da daju funkcionalnost krajnjoj klasi. Jako moćan sistem, tzv "policy based design".

E sad u Javi ili npr C#u imaš obavezan Object koji je koren svega. Kad bi se uvelo višestruko nasleđivanje u takve jezike, gde da se ubaci virtuelno nasleđivanje? Jedino da sve klase budu po defaultu virtuelno nasleđene od Object-a.
 
Odgovor na temu

StMilan

Član broj: 5061
Poruke: 144
*.ptt.yu



Profil

icon Re: Višestruko nasleđivanje u Javi21.01.2004. u 22:49 - pre 246 meseci
Malo kasno, ali nadam se korisno.
Evo sta kazu GoF u Desing Patterns knjizi. Eh, sad cu da se ubijem prepisujuci. Imas sve na strani 17, pretpostavljam da vam je biblioteka tu (ovo kazem filmilu)super pa potrazi. Stvarno je super knjiga.
Citat:

It's also important to understand the difference between class inheritance and interface inheritance (or subtyping). Class inheritance defines an object's implementation in terms of another object's implementation. In short, it's a mechanism for code and representation sharing. In contrast, interface inheritance (or subtyping) describes when an object can be used in place of another.

It's easy to confuse this two concepts, because many languages don't make ditinction explicit...


I tako dalje. Koliko ja znam, Java se pojavila posle ove knjige, sto nije toliko bitno, vec je bitno da je do tada vec otprilike shvaceno kako treba praviti objektni softver i Java je dizajnirana da to olaksa. C# je dosao jos kasnije, i moguce je da lupam jer ne znam C#, neke stvari su to jos doradjene u odnosu na javu (npr. automatski seteri i geteri).
Jos dva saveta iz knjige:
Citat:
Program to an inteface, not an implementation

Citat:
Favor object composition over class inheritance


Ja to shvatam da ako ti ikad zatreba visestruko nasledjivanje, sva je prilika da ces to moci da uradis pomocu kompozicije objekata, sto ce ti se na duge staze jos i isplatiti jer ces lako moci da promenis neki od objektata koje koristis. Plus su implementacije odvojene u vise klasa sa manjom zavisnoscu i kod je lakse odrzavati.

Ako pogledas neke nove frameworkove, npr. na jakarta.apache.org videces da imaju hijerarhiju intefejsa i hijerarhiju implementacionih klasa. Sve je maksimalno fleksibilno.
 
Odgovor na temu

StMilan

Član broj: 5061
Poruke: 144
*.ptt.yu



Profil

icon Re: Višestruko nasleđivanje u Javi27.01.2004. u 21:07 - pre 246 meseci
Mali follow-up na ono sto sam napisao.
Par interesantnih clanaka sa javawold.com.

"Why extends is evil":
http://www.javaworld.com/javaw...w-08-2003/jw-0801-toolbox.html

"Why getter and setter methods are evil":
http://www.javaworld.com/javaw...w-08-2003/jw-0801-toolbox.html
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Višestruko nasleđivanje u Javi27.01.2004. u 23:13 - pre 246 meseci
Generalizacije, generalizacije...

http://www.parashift.com/c++-f...iple-inheritance.html#faq-25.2

"I've been told that I should never use multiple inheritance. Is that right?

Grrrrrrrrr.

It really bothers me when people think they know what's best for your problem even though they've never seen your problem!! How can anybody possibly know that multiple inheritance won't help you accomplish your goals without knowing your goals?!?!?!?!!!

Next time somebody tells you that you should never use multiple inheritance, look them straight in the eye and say, "One size does not fit all." If they respond with something about their bad experience on their project, look them in the eye and repeat, slower this time, "One size does not fit all."

People who spout off one-size-fits-all rules presume to make your design decisions without knowing your requirements. They don't know where you're going but know how you should get there.

Don't trust an answer from someone who doesn't know the question.
"
 
Odgovor na temu

StMilan

Član broj: 5061
Poruke: 144
*.ptt.yu



Profil

icon Re: Višestruko nasleđivanje u Javi28.01.2004. u 16:21 - pre 246 meseci
Uopste mi nije bila namera da govorim za ili protiv visestrukog nasledjivanja, jer toga u Javi i nema, a ovo je Java forum.
I linkovi koje sam postovao se odnose na Javu, naravno nemaju veze sa visestrukim nasledjivanjem (mozda sam zbog toga promasio topic). I tamo navodi da svaki savet mora da se uzme u kontekstu odredjene primene ili projekta.
Tako da bih mogao da se slozim sa prethodnim postom, samo mi se cini da su moji postovi pogresno shvaceni kao saveti protiv visestrukog nasledjivanja, a u stvari su samo saveti za dobar dizajn koje ne treba shvatiti kao iskljucive.
 
Odgovor na temu

Last Man Standing
Misha Kostich
Chicago

Član broj: 3775
Poruke: 101
*.client.comcast.net



+1 Profil

icon Re: Višestruko nasleđivanje u Javi29.01.2004. u 06:45 - pre 246 meseci
Ne moras toliko da se izvinjavas, nece ti niko nista. Nisi rekao (prepisao) nista netacno :)

Design Patterns su nastali pre Jave (a posle C++ i SmallTalka), a vecina primera je u C++. Svrha patterna i jeste generalizacija, tako da se odredjene klase problema (koje se ponavljaju u zivotu) resavaju na odredjeni (isti) nacin. Mozda su preference autora dovele do toga da se visestruko nasledjivanje pomene samo jedan jedini put (kod Adaptera), a mozda se MI zaista nije pokazao kao dobar koncept, ako ne tehnicki, ono zato sto 95% ljudi ne zna da ga koristi kako valja (ukljucujuci i mene). Isto kao sto su i partizani imali samo jednog mitraljesca, a svi ostali su nosili puske. Medjutim, "Design Patterns" (1994) je postala jedna od najvaznijih knjiga, a za mnoge i osnova dizajna u objektno-orijentisanom razvoju softvera. Tako je MI dosta izgubio na publicitetu.

Mozda je evolucija jednostavno krenula u pogresnom pravcu, ali ako neka od buducih verzija Jave (C#) ili neki novi mainstream jezik ne uvede koncept visestrukog nasledjivanja, on ce verovatno (p)ostati specificnost C++-a, bio dobar ili los.

A computer once beat me at chess, but it was no match for me at kick boxing.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Višestruko nasleđivanje u Javi30.01.2004. u 19:59 - pre 246 meseci
Citat:
Last Man Standing:
Design Patterns su nastali pre Jave (a posle C++ i SmallTalka), a vecina primera je u C++.


Interesantno je da postoji knjiga sa primerima isključivo u SmallTalk-u:

http://www.aw-bc.com/catalog/a...duct/0,4096,0201184621,00.html

Citat:
Last Man Standing:
visestruko nasledjivanje pomene samo jedan jedini put (kod Adaptera),


U stvari, naveli su dve verzije Adaptera: class pattern koji koristi višestruko nasleđivanje, i object pattern koji koristi kompoziciju. Ja sam verziju sa MI-jem (koliko se sećam) iskoristio samo jednom, ali tada me je ona spasla nedelju dana prekucavanja i debugovanja.

Citat:
Last Man Standing:
Medjutim, "Design Patterns" (1994) je postala jedna od najvaznijih knjiga, a za mnoge i osnova dizajna u objektno-orijentisanom razvoju softvera. Tako je MI dosta izgubio na publicitetu.


Ne osporavajući značaj ove knjige koja je zaista cornerstone OO dizajna, u poslednje vreme se viđaju i pristupi koji mnogo više forsiraju MI. Mene je recimo posebno fascinirala knjiga "Modern C++ Design: Generic Programming and Design Patterns Applied". Doduše, autor obilato koristi specifičnosti C++a (posebno šablone), pa se tehnike koje opisuje (za sad) ne mogu primeniti u Javi.


 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Višestruko nasleđivanje u Javi08.03.2004. u 21:00 - pre 244 meseci
Interesantan link koji opisuje primenu jedne vrste višestrukog nasleđivanja (traits)

http://www.iam.unibe.ch/~scg/A...ers/Blac03aTraitsHierarchy.pdf


 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Višestruko nasleđivanje u Javi20.04.2004. u 17:06 - pre 243 meseci
Još jedan fin člančić o potencijalnoj upotrebi mixin-a u Javi:

http://www-106.ibm.com/developerworks/java/library/j-diag1203/
 
Odgovor na temu

[es] :: Java :: Višestruko nasleđivanje u Javi

[ Pregleda: 6099 | Odgovora: 19 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.