Sto scrivendo due classi in C #:
- Una classe
Matrix
che rappresenta una matrice generale con dimensioni n-by-m - Una classe
SquareMatrix
che eredita daMatrix
e ha il vincolo di essere n-by-n
Il motivo per cui l'ho progettato in questo modo è perché le matrici quadrate supportano operazioni specifiche aggiuntive come il calcolo del determinante o dell'inverso, quindi essere in grado di garantire che tali funzioni siano disponibili con il tipo specifico che si sta utilizzando sono cose carine da avere. Inoltre, supporta tutte le normali operazioni Matrix e può essere usato come una matrice
Ho una funzione in Matrix
chiamata getTranspose()
. Calcola la trasposizione di Matrix e la restituisce come una nuova Matrix
L'ho ereditato in SquareMatrix
, ma siccome la trasposizione di una matrice quadrata è garantita come matrice quadrata, voglio anche che restituisca un SquareMatrix
Non sono sicuro del modo migliore per farlo.
- Posso ri-implementare la funzione in
SquareMatrix
, ma quella sarebbe la duplicazione del codice perché è essenzialmente lo stesso calcolo - Posso utilizzare gli operatori di typecast impliciti, ma se ho capito correttamente ciò causerebbe allocazioni non necessarie (upcast
SquareMatrix
aMatrix
, crea un nuovoMatrix
come trasposizione, crea un nuovoSquareMatrix
durante typecasting e throw via il transposedMatrix
) - Posso usare espliciti operatori typecast, ma sarebbe stupido dover tipografare esplicitamente la trasposizione di
SquareMatrix
, e ha anche lo stesso problema dell'operatore implicito con allocazioni non necessarie
C'è un'altra opzione? Dovrei cambiare il design di avere SquareMatrix
ereditare da Matrix
?
Questo problema si applica anche agli operatori. Sembra che sia necessario implementare operatori di typecasting che potrebbero costare in termini di prestazioni o dover implementare nuovamente lo stesso codice.