2008-08-26 19 views

Antwort

0

Mein aktuelles Spielzeugprojekt verwendet dynamic_cast zweimal; einmal, um den Mangel an mehrfachen Versand in C++ zu umgehen (es ist ein Besucher-Stil-System, das mehrere Dispatch anstelle der Dynamic_casts verwenden könnte), und einmal, um einen speziellen Subtyp zu spezialisieren.

Beide sind aus meiner Sicht akzeptabel, obwohl ersteres zumindest auf ein Sprachdefizit zurückzuführen ist. Ich denke, dass dies in der Tat eine gemeinsame Situation sein kann; Die meisten Dynamic_Casts (und sehr viele "Design Patterns" im Allgemeinen) sind Workarounds für bestimmte Sprachfehler und nicht für etwas, das darauf abzielt.

0

Es kann für ein bisschen Laufzeit Typ Sicherheit verwendet werden, wenn Griffe zu Objekten über eine C-Schnittstelle ausgesetzt werden. Haben alle exponierten Klassen von einer gemeinsamen Basisklasse geerbt. Wenn Sie ein Handle für eine Funktion akzeptieren, müssen Sie zuerst in die Basisklasse und dann dynamisch in die erwartete Klasse umwandeln. Wenn sie in einem nicht-sensitiven Handle übergeben werden, erhalten Sie eine Ausnahme, wenn die Laufzeit den rtti nicht finden kann. Wenn sie ein gültiges Handle des falschen Typs übergeben, erhalten Sie einen NULL-Zeiger und können Ihre eigene Ausnahme auslösen. Wenn sie den richtigen Zeiger übergeben, ist es gut zu gehen. Dies ist nicht narrensicher, aber es ist sicherlich besser, falsche Aufrufe an die Bibliotheken zu bekommen als eine direkte Neuinterpretation von einem Handle und wartet, bis einige Daten auf mysteriöse Weise beschädigt werden, wenn Sie das falsche Handle übergeben.

1

Hier ist etwas, was ich oft mache, es ist nicht schön, aber es ist einfach und nützlich.

ich oft mit Schablonen Containern arbeiten, die eine Schnittstelle zu implementieren, vorstellen so etwas wie

template<class T> 
class MyVector : public ContainerInterface 
... 

Wo ContainerInterface Grund nützliche Sachen, aber das ist alles. Wenn ich einen speziellen Algorithmus für Vektoren von ganzen Zahlen haben möchte, ohne meine Template-Implementierung freizugeben, ist es nützlich, die Interface-Objekte zu akzeptieren und sie in der Implementierung auf MyVector herunterzufahren. Beispiel:

// function prototype (public API, in the header file) 
void ProcessVector(ContainerInterface& vecIfce); 

// function implementation (private, in the .cpp file) 
void ProcessVector(ContainerInterface& vecIfce) 
{ 
    MyVector<int>& vecInt = dynamic_cast<MyVector<int> >(vecIfce); 
    // the cast throws bad_cast in case of error but you could use a 
    // more complex method to choose which low-level implementation 
    // to use, basically rolling by hand your own polymorphism. 

    // Process a vector of integers 
    ... 
} 

Ich könnte einen Prozess() -Methode zum ContainerInterface hinzufügen, die polymorph aufgelöst werden würden, wäre es eine schöne OOP Methode sein, aber ich manchmal bevorzuge es auf diese Weise zu tun. Wenn Sie einfache Container und viele Algorithmen haben und Ihre Implementierung verborgen bleiben möchten, bietet dynamic_cast eine einfache und hässliche Lösung.

Sie könnten auch Doppelversandtechniken betrachten.

HTH

0

Nun wäre es wirklich mit Erweiterungsmethoden in C# schön.

Zum Beispiel sagen wir, ich habe eine Liste von Objekten und ich möchte eine Liste aller IDs von ihnen bekommen. Ich kann alle durchgehen und sie herausziehen, aber ich möchte diesen Code zur Wiederverwendung heraussegeln.

so etwas wie

List<myObject> myObjectList = getMyObjects(); 

List<string> ids = myObjectList.PropertyList("id"); 

würde außer auf der Erweiterungsmethode cool Sie nicht die Art kennen, die in kommt.

So

public static List<string> PropertyList(this object objList, string propName) { 
    var genList = (objList.GetType())objList; 
} 

wäre genial.

9

Dieser aktuelle Thread gibt ein Beispiel, wo es praktisch ist. Es gibt eine Basis-Shape-Klasse und daraus abgeleitete Klassen Circle und Rectangle. Beim Testen auf Gleichheit ist es offensichtlich, dass ein Kreis nicht gleich einem Rechteck sein kann und es wäre ein Desaster, zu versuchen, sie zu vergleichen. Beim Durchlaufen einer Sammlung von Zeigern zu Shapes übernimmt dynamic_cast die doppelte Aufgabe, Ihnen mitzuteilen, ob die Shapes vergleichbar sind und Ihnen die richtigen Objekte für den Vergleich zu geben.

Vector iterator not dereferencable

0

Es ist sehr nützlich, aber die meiste Zeit ist es zu nützlich: wenn für den Job zu bekommen, der einfachste Weg getan ist eine dynamic_cast zu tun, es ist mehr als oft nicht ein Symptom schlechtes OO-Design, was wiederum zu unvorhergesehenen Problemen in der Zukunft führen könnte.