Eredità multipla.
Forse quello che stai illuminando è il fatto che tutte le classi base per ABCDoc, sono anche sottoclassi della stessa classe base, e non gerarchie di classi diverse.
In realtà, penso che sia una combinazione di 2 tecniche, in primo luogo, estendendo una classe base per diversi casi:
.................................................................................................................
.................................................................................................................
....+-----------------------------------------+................+----------------------------------------------+..
....| <<class>> |....../|........| <<class>> |..
....| GenericDocument |...../.|...+----| TextDocument |..
....+-----------------------------------------+----<..|---+....+----------------------------------------------+..
....| [+] Load(...) <<virtual>> |.....\.|...|....| [+] Load(...) <<override>> |..
....| [+] Save(...) <<virtual>> |......\|...|....| [+] Save(...) <<override>> |..
....| [+] DoSomething(...) <<non virtual>> |...........|....| [+] SpecificMethod_A(...) <<non virtual>> |..
....+-----------------------------------------+...........|....+----------------------------------------------+..
..........................................................|......................................................
..........................................................|....+----------------------------------------------+..
..........................................................|....| <<class>> |..
..........................................................|----| BitmapDocument |..
..........................................................|....+----------------------------------------------+..
..........................................................|....| [+] Load(...) <<override>> |..
..........................................................|....| [+] Save(...) <<override>> |..
..........................................................|....| [+] SpecificMethod_B(...) <<non virtual>> |..
..........................................................|....+----------------------------------------------+..
..........................................................|......................................................
..........................................................|....+----------------------------------------------+..
..........................................................+----| <<class>> |..
...............................................................| XMLDocument |..
...............................................................+----------------------------------------------+..
...............................................................| [+] Load(...) <<override>> |..
...............................................................| [+] Save(...) <<override>> |..
...............................................................| [+] SpecificMethod_C(...) <<non virtual>> |..
...............................................................+----------------------------------------------+..
.................................................................................................................
.................................................................................................................
Secondo, avere una singola classe che incapsula tutti gli scenari esistenti.
..........................................................
..........................................................
....+----------------------------------------------+......
....| <<class>> +---+..
....| TextDocument |...|..
....+----------------------------------------------+...|..
....| [+] Load(...) <<override>> |...|..
....| [+] Save(...) <<override>> |...|..
....| [+] SpecificMethod_A(...) <<non virtual>> |...|..
....+----------------------------------------------+...|..
.......................................................|...................................................................
....+----------------------------------------------+...|.../|.....+-----------------------------------------------------+..
....| <<class>> |...|../.|.....| <<class>> |..
....| BitmapDocument |---+-<..|-----| MultipleFormatDocument |..
....+----------------------------------------------+...|..\.|.....+-----------------------------------------------------+..
....| [+] Load(...) <<override>> |...|...\|.....| [+] Load(...) <<override>> |..
....| [+] Save(...) <<override>> |...|..........| [+] Save(...) <<override>> |..
....| [+] SpecificMethod_B(...) <<non virtual>> |...|..........| [+] SelectDefaultFileFormat(...) <<non virtual>> |..
....+----------------------------------------------+...|..........+-----------------------------------------------------+..
.......................................................|...................................................................
....+----------------------------------------------+...|..
....| <<class>> +---+..
....| XMLDocument |..
....+----------------------------------------------+..
....| [+] Load(...) <<override>> |..
....| [+] Save(...) <<override>> |..
....| [+] SpecificMethod_C(...) <<non virtual>> |..
....+----------------------------------------------+..
......................................................
Ho un caso simile. Una classe è composta da diverse classi base,
che deve discendere dalla stessa classe, anche.
Penso che ci siano 2 situazioni di questi. Se le classi di base intermedie, possono essere considerate per aggiungere più classi ("più formati di file"), forse la classe finale dovrebbe essere cambiata in questo modo:
........................................................................................................................
....+-----------------------------------------+......./|......+-----------------------------------------------------+...
....| <<class>> |....../.|......| <<class>> |...
....| GenericDocument |-----<..|------| MultipleFormatDocument |...
....+-----------------------------------------+......\.|......+-----------------------------------------------------+...
....| [+] Load(...) <<virtual>> |.......\|......| [+] Load(...) <<override>> |...
....| [+] Save(...) <<virtual>> |...............| [+] Save(...) <<override>> |...
....| [+] DoSomething(...) <<non virtual>> |...............| [+] SelectDefaultFileFormat(...) <<non virtual>> |...
....+------------------+----------------------+...............+-----------------------------------------------------+...
.......................|.................................................................^..............................
.......................|................................................................/.\.............................
.......................^.............................................................../...\............................
....................../.\..............................................................\.../............................
...................../...\..............................................................\./.............................
..................../-----\..............................................................V..............................
.......................+.................................................................|..............................
.......................|.................................................................|..............................
.......................|.......................................+-------------------------+---------------------------+..
.......................+---------------------------------------| <<class>> |..
...............................................................| <<Many classes>> |..
...............................................................+-----------------------------------------------------+..
...............................................................| [+] Load(...) <<override>> |..
...............................................................| [+] Save(...) <<override>> |..
...............................................................+-----------------------------------------------------+..
........................................................................................................................
Dove può supportare diverse classi di formati di file come "add-on".
C'è una seconda situazione.
Nella mia app. la classe finale discende da 4 classi specifiche,
Dovevo avere accesso ai metodi specifici di quelle classi intermedie,
e per aggiungere più classi non si applicava. E le 4 classi intermedie,
doveva essere discendente della stessa base o della stessa classe root.
Se era un'altra lingua, quello supportava più interfacce di ereditarietà,
forse tutte queste soluzioni potrebbero essere più semplici.
Ma, per il secondo caso, "odoro", un Design Pattern senza nome.