Diskuse se zase zvrtla, tak to shrňme. Jsou tři možnosti:
1. Konverze Matrix na SquareMatrix, vznikne nový objekt, který ale může využít "vnitřnosti" obecnější matice. V C++ by pak bylo něco jako SquareMatrix(a*b).trace() (násobení vždy vrací instanci Matrix).
2. Dynamické řešení, násobení vrací instanci Matrix nebo SquareMatrix podle rozměrů. Použití: ((a*b) as SquareMatrix).trace() (nic nového se nevytváří).
3. Mít dvě implementace metody pro násobení a využít inferenci typu a polymorfismus návratového typu; není nutné nic kopírovat ani použít as, prostě se napíše (a*b).trace() ("magii" udělá překladač v době kompilace). Nevýhody: jde to jen ve Swiftu (ze zmiňovaných jazyků) a ti jednodušší (programátoři-praktici, jak je někdo nazval

) to nejsou schopni pochopit. Je fakt, že příklad by šel asi vymyslet lepší.
(4. Mít jen jednu třídu, to ale není odpověď na otázku.)