V Javě kočky vidí lidem do DNA a dokonce ji mohou modifikovat

A mohlo to být horší. Podle toho, o čem se zmínil můj přednášející v odpovědi na můj dotaz (tvůrci Javy si pohrávali s myšlenkou zrušit modifikátor private), mohly kočky na potkání lidem měnit jména nebo rozhodovat o jejich bydlišti.

Představte si následující schéma (i když není tak docela odpovídající realitě).

Ze zvířete se oddělí dvě větve – lidé a kočky, přičemž lidé v průběhu své specializace získají špatný gen. Špatný gen můžeme chápat jako něco, co bude upravovat chování člověka, čili to bude čistě jeho vnitřní záležitost. Záležitost bazálních systémů v jeho těle, o kterých by nemělo tušit ani jeho vlastní vědomí. Budeme-li chtít naprogramovat takové schéma, nabízí se využití modifikátoru protected, který byl pro to vymyšlen. Zkusme to tedy v Javě.

Následující kód je vytržený z původní struktury. Takto by v javě nebyl kompilovatelný, ale snad mi prominete.

public abstract class Animal { ; } public abstract class Human extends Animal { protected boolean bad_gene; public Human() { bad_gene = true; } } public class MaleHuman extends Human { ; } public class Cat extends Animal { private boolean memory; public Cat() { memory = false; } public void readGenesOfHuman(Human h) { memory = h.bad_gene; // will compile } }

Tento kód se i včetně šílené funkce koček readGenesOfHuman zkompiluje bez problémů, protože v Javě je toto v pořádku. Očekává se, že třídy v jednom balíčku si budou natolik blízké, že nebude problém, když si navzájem uvidí na chráněná data. V praxi by to ale znamenalo, že si pro každou třídu nebo minimální sadu odvozených tříd budete vytvářet samostatné balíčky. To se ale nedělá a protected se nepoužívá. Bez této funkcionality ale nelze výše nakreslené schéma správně naprogramovat. Buď chráněná data uvidí kočky… nebo je neuvidí ani interní funkce odvozené třídy. Dva extrémy, ani jeden žádoucí. V Javě správné řešení takového problému neexistuje, narozdíl od normálních jazyků:

ref class Animal abstract { public: Animal(void); virtual ~Animal(void); }; ref class Human abstract : Animal { public: Human(void); virtual ~Human(void); protected: bool bad_gene; }; ref class MaleHuman : Human { public: MaleHuman(void); virtual ~MaleHuman(void); }; ref class Cat : Animal { public: Cat(void); virtual ~Cat(void); void readGenesOfHuman(Human ^h); private: bool memory; }; // ... void Cat::readGenesOfHuman(Human ^h) { memory = h->bad_gene; // will not compile }

Takový kód se právem nezkompiluje. Chybový výstup bude znít přesně:

error C2248: ‘Human::bad_gene’ : cannot access protected member declared in class ‘Human’

V C++ a jazycích Microsoftu vše funguje normálně a kočky do vaší DNA nevidí.

Leave a Reply

Security Code: