So erweitern Sie die Basisklassenlogik und können ihr gleichzeitig abgeleitete Klassen zuweisenC#

Ein Treffpunkt für C#-Programmierer
Guest
 So erweitern Sie die Basisklassenlogik und können ihr gleichzeitig abgeleitete Klassen zuweisen

Post by Guest »

Ich habe Probleme, das folgende Konzept zu verstehen:
Ich versuche, eine Basisklasse mit den folgenden Eigenschaften zu erweitern:

Code: Select all

public class MovingItem : Item
{
public Vector2 Acceleration { get; set; }
public Vector2 Velocity { get; set; }
public Vector2 Position { get; set; }
}
und ich habe mehrere Item-Klassen, die verschiedene Artikel beschreiben, z. B. Sphäre, Waffe, Sprite usw. usw., sie haben von Natur aus eine andere Logik, aber sie sind alle Gegenstände
Da sich MovingItem und die oben genannten Elemente in diesem Fall im Vererbungsbaum auf derselben Ebene befinden, kann ich keine Variable wie diese zuweisen:

Code: Select all

MovingItem mi = new Weapon() { ... };
Denn offensichtlich ist Weapon ein Gegenstand, ebenso MovingItem, aber die Waffe ist kein MovingItem
Eine offensichtliche Lösung wäre, diese Itemss so zu gestalten, dass sie MovingItem anstelle von Item erben, aber ich könnte mir zwei Probleme mit dieser Art von Lösung vorstellen:< /p>
  • Was wäre wenn Diese Klassen können nicht geändert werden, da es sich um Drittanbieterklassen handelt (z. B. Steuerelemente in einigen UI-Bibliotheken).
  • Was wäre, wenn in Zukunft Ich möchte die Items-Logik auf eine grundsätzlich andere Art und Weise erweitern als MovingItem, wie PickupableItem
I Dachte, dass so etwas funktionieren könnte:

Code: Select all

public class MovingItem : T where T : Item
{
public Vector2 Acceleration { get; set; }
public Vector2 Velocity { get; set; }
public Vector2 Position { get; set; }
}
Ich dachte, das könnte mir dabei helfen, nicht das Item direkt zu erweitern, sondern diese Implementierungen zu umschließen, und nicht möglicherweise Hunderte von Klassen von Hand erstellen zu müssen...
Aber leider ist das nicht möglich, der Compiler sagt, dass die Klasse nicht vom Typparameter erben kann:

Code: Select all

CS0689: Cannot derive from 'T' because it is a type parameter
Letztendlich möchte ich eine Lösung erreichen, bei der ich ein MovingItem-Objekt aus einem anderen Item-Objekt erstellen und es dann wie dieses MovingItem bedienen kann ist ein Artikel wie folgt...

Code: Select all

public class ItemCollection { ...
public void Add(Item item) { ... }
}
...
MovingItem movingWeapon = new Weapon(); { ... }
itemsCollection.Add(movingWeapon); // .Add(...) accepts argument of type Item
Also... gibt es eine Lösung für diese Art von Problem, Item zu erweitern und gleichzeitig ein Item für alle anderen Klassen zu sein, die es erben?
Wie gehe ich das an?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post