Mi sono imbattuto in un enigma interessante mentre codificavo le mie implementazioni per gli insiemi di base di numeri matematici (Naturale, Integer, Razionale, Irrazionale, Reale, Complesso). Lo sto facendo principalmente per divertimento, ma anche perché voglio rappresentare correttamente i numeri nel codice.
È iniziato con RationalNumber. Ho aggiunto due campi alla mia classe: numeratore e denominatore. Ho sovraccaricato tutti gli operatori di base che sono in grado di (sto usando C #) in modo da poter definire cosa significa aggiungere, sottrarre, ecc. Per questi oggetti.
Da qui, ho pensato di estendere le mie definizioni verso l'alto e di creare una classe RealNumber
tale che questo tipo possa estendersi da esso in modo che possa riempire qualsiasi numero di RealNumber nel codice ... Tranne intuitivamente, il sistema numerico funziona in modo contrario a questa definizione.
Illustrando cosa intendo, considera di iniziare con i numeri naturali di base. Possiamo "estendere" i numeri naturali per includere anche i numeri negativi (e zero se non lo includeste già) e poi chiamiamo questo nuovo gruppo gli interi. Nel codice, ciò implicherebbe che Integer
erediti da NaturalNumber
. Se volessi scrivere un metodo che accetta un parametro intero, logicamente si potrebbe assumere che si possa usare anche un numero naturale; ma con il modo in cui funziona l'ereditarietà, questo non vola.
Come posso modellare correttamente la relazione tra gli insiemi di numeri attraverso l'ereditarietà in modo da poter inserire un numero naturale?