Rappresenta la gerarchia di gruppi di numeri utilizzando l'ereditarietà del tipo

0

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?

    
posta agent154 04.08.2014 - 01:36
fonte

1 risposta

1

Stai pensando al contrario. Gli integer non sono un'estensione dei numeri naturali in questo senso, sono un superset. Quindi i numeri naturali ereditano dai numeri interi con la condizione che non possono essere negativi o nulli. Un equivalente intero senza segno sarebbe un adattamento naturale.

Ricorda che molte versioni della macchina di tipi numerici non sono esattamente la stessa di come un matematico potrebbe definire un tipo di numero. Haskell ha un modo interessante di definire numeri. Potresti essere in grado di implementare qualcosa di simile in C #.

    
risposta data 04.08.2014 - 01:50
fonte

Leggi altre domande sui tag