Другие языки программирования и технологии

Вопрос по ооп. С#

Есть основной класс - BaseWeapon. У него есть дочерние классы такие как Rifles, Pistols и т. д. В них свои методы. В скрипте FunctionMnger должны вызываться эти методы через переменную BaseWeapon curWeapon. В FunctionMnger стоят проверки на input и принадлежность определенным классам (is). Будет ли это работать и как можно вызвать эти функции?
>В FunctionMnger стоят проверки на input и принадлежность определенным классам (is).
А нахрена? То есть иногда такое дело надо, но очень редко. Если уж ты вызываешь все через BaseWeapon, так и используй полиморфизм и инкапсуляцию, зачем тебе знать, какой именно там наследник?

Примерчик:

public abstract class BaseWeapon
{
protected abstract int GetMagSize();
public int MagSize { get { return GetMagSize(); } }
private int currentAmmo = 0;
public int CurrentAmmo { get { return currentAmmo; } }
public void Reload(ref int AmmoSupply)
{
int AmmoLoaded = Math.Min(AmmoSupply, MagSize - CurrentAmmo);
currentAmmo += AmmoLoaded;
AmmoSupply -= AmmoLoaded;
}
}

public class AKM: BaseWeapon
{
protected override int GetMagSize()
{
return 30;
}
}

public class SteyerAUG : BaseWeapon
{
protected override int GetMagSize()
{
return 40;
}
}

class Program
{
static void ReloadWeapon(BaseWeapon Weapon, ref int AmmoSupply)
{
Weapon.Reload(ref AmmoSupply);
}

static void Main(string[] args)
{
AKM MyAKM = new AKM();
SteyerAUG MyAUG = new SteyerAUG();
int AmmoSupply = 65;
ReloadWeapon(MyAKM, ref AmmoSupply);
ReloadWeapon(MyAUG, ref AmmoSupply);
Console.WriteLine("AKM ammo: {0}", MyAKM.CurrentAmmo);
Console.WriteLine("AUG ammo: {0}", MyAUG.CurrentAmmo);
}
}

Как видишь, метод ReloadWeapon ничего не знает о конкретном типе оружия, что не мешает ему это оружие правильно перезаряжать в соответствии с емкостью магазина. Вот и твоему FunctionMnger совершенно необязательно об этом ничего знать.
ЗЫ: у меня тут АКМ и АУГ используют один тип боеприпасов, но это только для примера, разумеется. В нормальной программе надо передавать им весь рюкзак, а они сами должны найти в нем свои боеприпасы и сделать с ними все что надо.
Олег Булько
Олег Булько
67 609
Лучший ответ
Миша Гурин Cпасибо!
А в чем проблема? Если класс известен, берем объект и вызываем нужный метод.
Сергей Разумов
Сергей Разумов
10 312
Можно никак. А вместо этого сделать единый метод (допустим, Shoot(), если это о том) в BaseWeapon и унаследовать во всех дочерних, переопределив по-своему в каждом.
Артём Тарасов
Артём Тарасов
5 149
Миша Гурин А если придется делать дробовик или лук, метод shoot уже не подойдет.