2017-02-16 7 views
0

werfen Ich muss Objekt auf einen der Typen, die bestimmte Eigenschaft und Methode haben, werfen. Zuerst muss ich überprüfen, ob mein Objekt eine Instanz eines dieser Typen ist, und dann muss ich es auf diesen Typ umwandeln und einige Aktionen ausführen.Wie man Objekt zum Eingeben von C#

Wie kann ich es tun, ohne Code zu wiederholen?

var foo = GetAnimalById(animalId); // Animal type returned to foo 

var animal = new Animal(); // Animal class hasn't Age property and GiveVitamins method 
if (foo is Tiger) { 
    animal = foo as Tiger; 
    if (animal.Age >= 10) 
    { 
     animal.GiveVitamins(); 
    } 
} 
if (foo is Lion) { 
    animal = foo as Lion; 
    if (animal.Age >= 10) 
    { 
     animal.GiveVitamins(); 
    } 
} 
if (foo is Monkey) { 
    animal = foo as Monkey; 
    if (animal.Age >= 10) 
    { 
     animal.GiveVitamins(); 
    } 
} 
+3

Es ist ein dynamisches Dispatch Beispiel 'dynamic', aber ich werde das jetzt verlassen. Es sieht so aus, als ob alle Tiere die Mitglieder 'Age' und' GiveVitamins' teilen könnten. Warum also nicht diejenigen, die zur Basisklasse "Animal" gehören? –

+0

Ich denke, hier stimmt etwas nicht mit dem Design. Warum ist die Eigenschaft "Alter" in der Klasse "Tier" nicht vorhanden? Kannst du ein Tier nennen, das nicht alt wird? – Sweeper

+0

Wenn Sie 'Age' und' GiveVitamines' nicht zu 'Animal' verschieben können, sollten Sie' Tiger', 'Lion' und' Monkey' diese Schnittstelle implementieren und nach dieser Implementierung suchen. –

Antwort

0

Ich denke, es ist etwas falsch mit Ihrem Design. Jedes Tier sollte ein Alter haben, also anstatt eine separate Age Eigenschaft in Tiger, Lion und Monkey, verschieben Sie die Age Eigenschaft in die Animal Klasse.

Eine andere seltsame Sache über Ihr Design ist, dass die Tiere keine Vitamine geben. Sie erhalten Vitamine. Ich denke, Sie sollten die Methode in ReceiveVitamins umbenennen. Dann erstellen Sie eine Schnittstelle wie folgt aus:

interface VitaminReceivable { 
    void ReceiveVitamins(); 
} 

Haben Tiger, Lion und Monkey alle diese Schnittstelle implementieren, dann können Sie einfach tun:

var foo = GetAnimalById(animalId); // Animal type returned to foo 

var animal = new Animal(); // Animal class hasn't Age property and GiveVitamins method 
if (foo is VitaminReceivable) { 
    animal = foo; 
    if (animal.Age >= 10) 
    { 
     ((VitaminReceivable)animal).ReceiveVitamins(); 
    } 
} 

EDIT:

Nun, da ich Sie wissen, kann nicht Age in Animal haben, sollten Sie eine andere Schnittstelle erstellen:

interface Ageable { 
    int Age { get; } 
} 

Haben die Unterklassen der Schnittstelle implementieren und dann kann man schreiben:

var foo = GetAnimalById(animalId); // Animal type returned to foo 

var animal = new Animal(); // Animal class hasn't Age property and GiveVitamins method 
if (foo is VitaminReceivable && foo is Ageable) { 
    animal = foo; 
    if (((Ageable)animal).Age >= 10) 
    { 
     ((VitaminReceivable)animal).ReceiveVitamins(); 
    } 
} 
+1

Ihr Casting ist schrecklich.Verwenden Sie 'as' und seien Sie stärker – eocron

+0

@eocron Welche anderen Lösungen gibt es? Ich kann an nichts denken. – Sweeper

+0

Tiere geben Vitamine, wenn sie gegessen werden, vorausgesetzt, dass Animal. IsTasty wird auf "True" gesetzt – Zesty

Verwandte Themen