.NET: Boxing a dedičnosť tried

Prostredie .NET Framework podporuje len jednoduchú dedičnosť tried, čo odstraňuje veľa problémov spojených s polymorfnými triedami, ktoré dedia z viacerých tried. Tento nedostatok nahradzuje možnosť implementovať v triede neobmedzený počet rozhraní (interfaces).

Každá trieda implicitne dedí zo System.Object. Keď teda vytvoríte triedu, ktorá nededí zo žiadnej, kompilátor sám pridá dedenie zo System.Object.

class SimpleClass {
  int x;

  public int Value {
    get { return x; }
    set { this.x = value; }
  }
}

Trieda bude skompilovaná, akoby bolo definovaná takto:

class SimpleClass : System.Object {
  ...
}

Ak nejaká trieda dedí z inej, tak nutne musí získať metódy zo System.Object. Z tohoto dôvodu sú tiež v každej triede dostupné metódy ToString() alebo GetHashCode(). Je tiež možné si do typu Object uložiť akýkoľvek objekt.

Object o = new SimpleClass();
ArrayList al = new ArrayList(1);
al.Add(new SimpleClass()); // argument metódy Add je typu Object

Keď chceme pracovať presne s daným dátovým typom uloženým v type Object, je potrebné spraviť pretypovanie (boxing):

Object o = new SimpleClass();

SimpleClass sc = (SimpleClass)o;

V premennej o je uložený celý object typu SimpleClass, ale premenná je deklarovaná ako Object a teda cez ňu môžeme pristupovať iba k fieldom definovaným v type System.Object.

Po pretypovaní o na SimpleClass už môžeme pristupovať k všetkým fieldom zo SimpleClass.

Trochu viac sa dočítate v dokumente OOP – Boxing.doc. Dokumente je vo formáte Microsoft Word. Ak ho nemáte naišntalovaný, na zobrazenie dokumentu môžete použiť Word Viewer 2003, ktorý je zdarma.