Mikä on menetelmän ohitus?

Menetelmän ohitusta käytetään perintöhierarkian olio-ohjelmoinnissa, ja se tapahtuu, kun superluokassa määritelty menetelmä määritetään uudelleen alaluokassa. Yleensä alaluokkamenetelmä tekee jotain erilaista kuin superluokan menetelmä tai laajentaa superluokan kykyä, mutta tämän ei tarvitse olla näin. Menetelmän ohitus tapahtuu aina, kun superluokan menetelmä määritetään uudelleen alaluokassa, riippumatta uudelleen määritellyn menetelmän sisällöstä. Uudelleen määritellyn menetelmän allekirjoitusten on oltava täsmälleen samat.

Esimerkiksi luokka A voi sisältää menetelmän nimeltä “doSomething”, eikä tämä menetelmä käytä syöttöparametreja. Lisäksi luokat B ja C voivat olla luokan A alaluokkia. Luokka B voi sisältää menetelmän nimeltä “doSomething”, joka ei käytä syöttöparametreja, ja luokka C saattaa sisältää menetelmän “doSomething”, joka ottaa luvun syöttöparametriksi. Tässä esimerkissä vain luokka B osoittaisi menetelmän ohituksen, koska sen “doSomething” -menetelmällä on sama metodin allekirjoitus kuin sen superluokalla, luokka A. Toisaalta luokan C “doSomething” -menetelmä osoittaa menetelmän ylikuormituksen, koska se luo täysin uusi menetelmä.

Virtuaalinen perintö C ++: ssa on toinen esimerkki menetelmän ohittamisesta. Virtuaalisia menetelmiä superluokissa voidaan tai ei ehkä toteuteta, mutta mikä tahansa niiden alaluokan määritelmä on esimerkki menetelmän ohittamisesta. Kun menetelmä ohitetaan alaluokassa, superluokan menetelmää ei kutsuta, ellei sitä vedota nimenomaisesti. Tämän nimenomaisen tavan kutsua ohitettu menetelmä sanotaan usein “piilottavan” superluokan toteutuksen.

Vaikka menetelmän ohitus on erittäin joustava, kaikkia menetelmiä ei voida ohittaa, ja joskus tämä jäykkyys saattaa olla parempi. Sekä Javassa että C ++: ssa menetelmän allekirjoituksissa voidaan käyttää tiettyjä avainsanoja, jotta estetään menetelmän ohittaminen alaluokassa. Tätä varten Java käyttää “lopullista” avainsanaa ja C ++ käyttää “const” -avainsanaa. Menetelmän ohittamisen estämisestä voi olla hyötyä, jos tietty toiminto on aina pysynyt muuttumattomana koko perintöpuussa.

Yleensä yksinkertaisia ​​menetelmiä, joilla saadaan pieniä tietoja, ei tarvitse ohittaa. Tapauksia, jotka yleensä hyötyvät eniten ohittamisesta, ovat silloin, kun alaluokka pyrkii lisäämään toiminnallisuutta superluokan menetelmään luomatta täysin uutta menetelmää. Tästä tekniikasta voivat hyötyä myös epätavalliset tapaukset, joissa menetelmä on uusittava kokonaan tietyntyyppiselle objektille. Aina kun jokin menetelmä ohitetaan, on tärkeää, että ohjelmoija kommentoi riittävästi sekä super- että alaluokan menetelmiä. Ihannetapauksessa näiden kommenttien pitäisi selventää, mitä kukin menetelmän vaihtoehto tekee, sekä miten ja miksi ne eroavat toisistaan.