taltech-coding / javadoc

TTÜ Java õppematerjalid
https://ained.ttu.ee/javadoc
8 stars 13 forks source link

OOP: nähtavus (private, protected, public, tühi) #40

Closed agoluberg closed 7 years ago

DenissPota commented 7 years ago

https://github.com/tutjava/materjalid/blob/master/oopVisibility.rst

agoluberg commented 7 years ago

AudioPlayer koodinäite formaat on kuidagi paigast ära. Ma soovitaks viimase näite ümber teha publicuga. Asi selles, et seal lisaks "public" märksõnale on ka "static". Võimalik, et nad saavad sellest ikkagi aru, aga kindlam oleks kõik teha mitte-staatilised näited. Muidu mõni arvab, et public peab alati static olema jne. Seesamane getName/setName on mõistlik näide. Lisaks võiks private meetodi ka teha. Et oleks näha, et vastav märksõna võib nii muutuja kui meetodi ees olla.

DenissPota commented 7 years ago

Viisin parandused sisse.

agoluberg commented 7 years ago

no modifier sektsioonis võiks koodinäide olla koos klassiga. Muidu ei saa sellest väga aru.

StreamingAudioPlayer näite puhul peab override'itav meetod olema kas protected või public. Lisaks override näitele võiks olla ka näiteks mingi kasutamise näide. Kui tahad, et vaid alamklass saab kasutada mingit meetodit, siis peaks see protected olema. Muidu see override näide hõlmab nagu override teemat ka. Mõnel võib segadusse ajada, kas see protected on kasutatav vaid override puhul.

agoluberg commented 7 years ago

Näiteks protected meetodi osas võiks mingi selline näide olla:

public class Super {
   ....
   public void doSomething() {
      doSomeSubTask();
      doSomethingElse();
   }

  protected void doSomeSubTask() {}
  protected void doSomethingElse() {}
}

public class SubClass extends Super {
   @Override
    protected void doSomeSubTask() {
      // this subtask is different for this sub class
    }
}

Äkki sa oskad mingisse konteksti ka panna. Näiteks kui sul on AudioPlayer, siis sellel võiks mingi meetod olla, mis omakorda jaguneb mitmeks alammeetodiks n-ö. Ja siis StreamingAudioPlayer'i puhul üks alammeetod peab olema erinev n-ö default implementatsioonist (mis AudioPlayer'is on). Aga näiteks teine alammeetod sobib StreamAudioPlayer'ile ka.

Ehk siis mõte on umbes selles, et kui üldiselt "doSomething" sobib, aga ühte osa oleks vaja ringi kirjutada, siis oleks tobe terve "doSomething" override'ida. Selle jaoks tehakse tihti nii, et jagatakse see meetod alamülesanneteks. Ja mõnda alamülesannet saab siis muuta alamklassi poolt. Samuti pole mõtet neid alamülesandeid public'uks teha, kuna kasutajal ei ole vajadust neid otse välja kutsuda (ja arvatavasti tihti ei tohigi).

Näiteks java enda standardteegis on selline: https://docs.oracle.com/javase/7/docs/api/java/util/AbstractList.html#removeRange(int,%20int) (neid on kindlasti veel, aga kiire google andis selle esimesena).

DenissPota commented 7 years ago

tegin

DenissPota commented 7 years ago

valmis selle suure commenti asjad, unustasin kirja panna siia

agoluberg commented 7 years ago

Korras, aitäh!