Ich bin in dieser Situation stecken, wo:Kann eine Methode mit einem abgeleiteten Parameter anstelle einer Basis überschrieben werden?
- Ich habe eine abstrakte Klasse
Ammo
, mitAmmoBox
undClip
als Kinder bezeichnet. - Ich habe eine abstrakte Klasse namens
Weapon
, mitFirearm
undMelee
als Kinder. Firearm
ist abstrakt, mitClipWeapon
undShellWeapon
als Kinder.- Innen
Firearm
, gibt es einvoid Reload(Ammo ammo);
Das Problem ist, dass ein ClipWeapon
verwenden könnte sowohl ein Clip
und ein AmmoBox
neu zu laden:
public override void Reload(Ammo ammo)
{
if (ammo is Clip)
{
SwapClips(ammo as Clip);
}
else if (ammo is AmmoBox)
{
var ammoBox = ammo as AmmoBox;
// AddBullets returns how many bullets has left from its parameter
ammoBox.Set(clip.AddBullets(ammoBox.nBullets));
}
}
Aber ein ShellWeapon
, nur ein AmmoBox
nutzen könnte, um neu laden. Ich kann dies tun:
public override void Reload(Ammo ammo)
{
if (ammo is AmmoBox)
{
// reload...
}
}
Aber das ist schlecht, weil, obwohl ich überprüfe, um sicherzustellen, es ist vom Typ AmmoBox
, von außen scheint es wie ein ShellWeapon
auch ein Clip
nehmen konnte, da ein Clip
ist Ammo
auch.
Oder ich Reload
von Firearm
entfernen konnte, und lege sie sowohl ClipWeapon
und ShellWeapon
mit der spezifischen params ich brauche, aber tun, damit ich die Vorteile von Polymorphismus verlieren, was nicht das, was ich will.
Wäre es nicht optimal sein, wenn ich Reload
innen ShellWeapon
wie dies außer Kraft setzen könnte:
public override void Reload(AmmoBox ammoBox)
{
// reload ...
}
Natürlich habe ich es versucht, und es hat nicht funktioniert, habe ich eine Fehlermeldung, die Signatur übereinstimmen muss oder etwas, aber sollte das nicht "logisch" gelten? seit AmmoBox
ist ein Ammo
?
Wie soll ich das umgehen? Und ist mein Design im Allgemeinen korrekt? (Hinweis: Ich verwendete die Schnittstellen IClipWeapon
und IShellWeapon
, aber ich lief in Schwierigkeiten, so zog ich stattdessen Klassen verwenden)
Vielen Dank im Voraus.
Wie kann die allgemeine Definition neu schreiben Sie schrieb aber für Firearm statt Waffe? (weil Shell und Clip Waffen von Firearm und nicht Weapon direkt erben) Ich habe sowas versucht, aber offensichtlich ist es das nicht: public abstract class Schusswaffe wo Munition: Munition: Waffe XD –
vexe
@VeXe: Du musst die ': Waffe einsetzen 'vor der' wo AmmoType: Ammo'. Ich werde meine Antwort aktualisieren, um dies zu zeigen. Ich würde Ihnen jedoch dringend empfehlen, das T-Präfix für Typparameter zu verwenden. –
Ich denke, das ist das Beste, aber darf ich fragen, warum hast du gesagt, dass es keine nützliche Methode ist, Dinge zu tun? – vexe