2012-01-06 14 views
12

So che il casting può essere fatto solo da una sottoclassifica a una super classe (su casting) ma questo esempio illustra cosa vorrei fare.Lanciare un oggetto di super classe in una sottoclasse - down casting

Class Super {} 
Class Sub extends Super {} 

Super super = new Super(); 
Sub sub = (Sub)super; 

Credo che questo sia indicato come casting "down", che non è consentito in modo ...

Qual è il modo migliore per creare un oggetto di Sub-tipo dato un oggetto di tipo Super.

EDIT:

Questa è la domanda - Qual è il modo migliore per convertire un animale ad un gatto.

La risposta? Inizia con un animale di tipo base e copia gli attributi nel gatto. Aggiungi pelliccia e coda, ecc. Fondamentalmente un costruttore di copie. È questa la risposta giusta (o una buona risposta)?

ALTRO EDIT:

Credo che la mia domanda è abbastanza chiaro, ma forse è troppo generica. Chiedere il modo "migliore" per fare qualcosa tende a dare molte risposte diverse. Mi rendo conto che il modo migliore può essere diverso in diverse circostanze.

Non sto cercando un tutorial su Java o OO. Solo pescando le opinioni, così posso risolvere questo problema, come ho delineato usando le migliori pratiche.

+0

Dalla tua domanda, non è affatto chiaro cosa sai e cosa non sai. Quindi non essere sorpreso quando le persone rispondono al * Credo che questo sia definito come "down" casting che non è permesso * parte e non la (molto vaga) "domanda reale". Sì, il costruttore di copie è il modo. No, non è l'unico, il metodo factory andrà benissimo. No, non è il migliore - non abbiamo idea di quali vincoli e ipotesi hai. – alf

+0

@alf Posso dire che la mia domanda è chiara per voi - Potete offrire ulteriori suggerimenti su come mettere in pratica le domande in generale? Mi piacerebbe essere in grado di fare una domanda che aggiunge valore al sito e ottiene risposte preziose, ma in questo caso sembra che io abbia fallito ... frainteso, downvoted e ho finito per essere un po 'frustrato. – Matthew

+1

bene, posso vedere la ripartizione dei voti, e non ci sono voti bassi. Niente voti, ma non era questo il punto, vero? Lo standard HOWTO sarebbe http://catb.org/~esr/faqs/smart-questions.html - è bello e pertinente. Sulla questione attuale, direi che dare la colpa a chi ha cercato di aiutare non è un'idea molto produttiva; affermando che la tua domanda è chiara quando hai bisogno di due modifiche è così vicino alla colpa che solo pochi noteranno la differenza. Aggiungi qui "Grazie per aver effettivamente letto la mia domanda" e avrai una buona dose di aggressività. Sii gentile. Correggi gli errori. Non incolpare – alf

risposta

9

A Cat è un Animal.

Se ti do un animale (non deve essere gatto), come lo convertiresti in un gatto?

EDIT:

C'è un modo per fare quasi tutto. La maggior parte delle volte, non dovresti. Credo che un design migliore eliminerebbe la necessità di downcasting. Ma è possibile:

  • avere un costruttore in Super che prende un Sub come parametro.

  • implementare una fabbrica di Super e avere un metodo che accetta come parametro un Sub.

Ti suggerisco di espandere la tua domanda, dicci esattamente di cosa hai bisogno, perché penso davvero che esista una soluzione più elegante.

+2

@Matthew - solo perché c'è un modo per farlo, non significa che dovresti. Saresti meglio statico quello che vuoi ottenere. Il downcasting è raramente la risposta, e sono sicuro al 99% che esista una soluzione migliore nel tuo caso. –

+0

Grazie per la risposta. Potrei semplicemente fare qualche ricerca e scoprire esattamente cos'altro potrei aver bisogno in questo caso e fare una domanda più dettagliata e specifica. Questo sicuramente farà ciò di cui ho bisogno in questo momento, mentre stavo solo chiedendo una risposta generale, ma so che mi imbatterò in una situazione in cui ho bisogno di qualcosa di più specifico dopo. – Matthew

1

EDIT: Dalla tua domanda, non è del tutto chiaro cosa sai e cosa non sai. Quindi non essere sorpreso quando le persone rispondono alla

Credo che questo si riferisce a come casting "down", che non è consentito

parte e non il (molto vago) "domanda effettiva".

Sì, il costruttore di copie è la strada.

No, non è l'unico, il metodo di fabbrica andrà benissimo.

No, non è il migliore: non abbiamo idea di quali vincoli e ipotesi possiate avere.


vecchia versione: Casting può essere fatto in entrambi i casi, con upcasting essendo di solito inutile (a meno che non è necessario selezionare un metodo di overload specifico).

In genere non è possibile creare un oggetto di tipo Sub con un oggetto di tipo Super oltre a creare un metodo che costruisca un nuovo oggetto basandosi sui dati da quello specificato.

Per eseguire il cast, devi essere sicuro che l'oggetto che stai lanciando sia in realtà il tipo di cast (o il suo sottotipo).

+0

Ho affermato specificamente che so che il casting è permesso e so che il down casting non lo è. Lo finisco chiedendo qual è il modo migliore per fare x data questa informazione. Sono un po 'retorico in questo momento - come faccio a non essere chiaro? – Matthew

+1

@Matthew bene, downcasting * è * permesso. Non è chiaro se tu sappia cos'è "downcasting", perché è effettivamente permesso, quindi è il solito "che contro" quale problema o mancanza di comprensione. Sulla base dell'esperienza precedente, molti assumono la mancanza di comprensione. – alf

+0

Immagino di poter dire "so che il casting non è permesso" ... "in questa particolare situazione". – Matthew

5

È possibile eseguire il downcast solo se l'oggetto reale è del tipo "Sub". Per esempio:

Super subAsSuper = new Sub(); 
Sub sub = (Sub)subAsSuper 

Il tuo modo non funzionerà perché super-non è una sottoclasse di sub. Quindi otterrai un errore di runtime.

5

È possibile aggiungere un costruttore alla classe Sub che accetta un oggetto Super come parametro.

0

prendere questa idea in mente -

Class Super {} 
Class Sub { 
    public Super super = new Super(); 
} 

Sub sub = new Sub(); 
sub.super = super; 

ho fatto un esempio molto semplice qui, ma si può andare dove vuoi con questo, è possibile farlo funzionare in modo identico come eredità. e non restituirà alcun errore, qualunque cosa.

Problemi correlati