Tôi đang mắc kẹt trong tình huống này ở đâu:Có thể ghi đè lên phương thức có tham số bắt nguồn thay vì tham số cơ sở không?
- Tôi có một lớp trừu tượng gọi là
Ammo
, vớiAmmoBox
vàClip
như trẻ em. - Tôi có một lớp trừu tượng có tên là
Weapon
, vớiFirearm
vàMelee
là trẻ em. Firearm
là trừu tượng, vớiClipWeapon
vàShellWeapon
là trẻ em.- Bên
Firearm
, có mộtvoid Reload(Ammo ammo);
Vấn đề là, một ClipWeapon
có thể sử dụng cả một Clip
và một AmmoBox
để tải lại:
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));
}
}
Nhưng một ShellWeapon
, chỉ có thể sử dụng một AmmoBox
để tải lại. Tôi có thể làm điều này:
public override void Reload(Ammo ammo)
{
if (ammo is AmmoBox)
{
// reload...
}
}
Nhưng điều này là xấu bởi vì, mặc dù tôi đang kiểm tra để chắc chắn rằng nó là loại AmmoBox
, từ bên ngoài, nó xuất hiện như một ShellWeapon
có thể mất một Clip
là tốt, vì một Clip
cũng là Ammo
.
Hoặc, tôi có thể loại bỏ Reload
từ Firearm
, và đặt nó cả ClipWeapon
và ShellWeapon
với params cụ thể tôi cần, nhưng làm như vậy tôi sẽ mất những lợi ích của Polymorphism, mà không phải là những gì tôi muốn.
Nó sẽ không được tối ưu, nếu tôi có thể ghi đè lên Reload
bên ShellWeapon
như thế này:
public override void Reload(AmmoBox ammoBox)
{
// reload ...
}
Tất nhiên tôi đã thử nó, và nó đã không làm việc, tôi nhận được một lỗi nói rằng chữ ký phải phù hợp hoặc cái gì đó, nhưng điều này không hợp lệ 'hợp lý'? kể từ AmmoBox
là Ammo
?
Tôi nên làm như thế nào? Và nói chung, thiết kế của tôi có đúng không? (Lưu ý tôi đã sử dụng giao diện IClipWeapon
và IShellWeapon
nhưng tôi gặp sự cố, vì vậy tôi đã chuyển sang sử dụng các lớp học)
Cảm ơn bạn trước.
Làm thế nào có thể viết lại định nghĩa chung chung bạn đã viết nhưng đối với Báng súng thay vì vũ khí? (vì Shell và Clip vũ khí kế thừa từ Súng và Vũ khí trực tiếp) Tôi đã thử một cái gì đó như thế này nhưng rõ ràng đó không phải là: public abstract class Firearm nơi AmmoType: Ammo: Weapon XD –
vexe
@VeXe: Bạn cần phải đặt ': Weapon 'trước' AmmoType: Ammo'. Tôi sẽ cập nhật câu trả lời của tôi để hiển thị điều này. Tôi sẽ * mạnh mẽ * khuyên bạn sử dụng tiền tố 'T' cho các tham số kiểu mặc dù. –
Tôi nghĩ rằng điều này là tốt nhất, nhưng tôi có thể hỏi tại sao bạn nói nó có thể không phải là một cách hữu ích để làm việc? – vexe