A kivétellel még mindig nem értem mi a baj. Ha mondjuk az ősösztály konstruktorában dobsz ellenőrzetlen kivételt (ami Javában a RuntimeException, C#-ban elfelejtettem mi, mert azt rég hsználtam), akkor a származtatott osztályok kódjában semmit nem kell miatta átírni (csak ott, ahol további ellenőrzést is végzel). A példányosításkor kell rá figyelni, pont ahogy sng- írta. Ha exceptiönt kezelő nyelvet használsz, akkor általában illik a nem normális lefutást exceptiönnel jelezni.
Az IDisposeable interfészt akkor kell használni, ha virtuális gépen kívüli erőforrást kezel az ojjektumod. Például fájlt, vagy socketet. A leírásod alapján nem vagyok benne biztos, hogy ez a helyzet.
Bár még mindig nem teljesen világos, hogy mi a célod :-), pár dolog kezd világlani:
1. Az ojjektum maga "jön rá" a konstruktorban, ráadásul típusonként eltérő módon, hogy ő jogosult-e vagy nem, azaz az "overloaded" konstruktorból is dobhatunk kivételt. Azonban ezek közül már van, ami meg van írva, amibe nem tudunk belenyúlni, tehát nem világos, hogy ő hogy jelzi a saját esetleges jogosulatlanságát.
2. Egy keretrendszer dinamikusan tölti be az ojjektumokat, amiből sokféle van, tehát vélhetően valami katalógusból névszerinti osztálybetöltéssel.
3. Erőforráskezelés is van, azaz pontosan nyomon kell követni, hogy az erőforrás kezelésének jogát és kötelességét átvette-e az ojjektum, vagy nem.
Jól értem?
Amúgy én azt javaslom, hogy találd ki, hogy pontosan mi a funkció. Ehhez csinálj egy interfészt, amin mindennek világos jelentése van. Majd a már meglévő dolgokat wrappeld le, hogy ezt az interfészt megvalósítsák. Általában nem érdemes a teljesítményt hajhászni, főleg nem az átláthatóság árán. Arról nem is beszélve, hogy a teljesítmény leginkább a használt algoritmusokon múlik, nem azon, hogy hány ősosztály, meg runtime típusellenőrzés van.