Другие языки программирования и технологии
Вопрос по ооп. С#
Есть основной класс - 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 совершенно необязательно об этом ничего знать.
ЗЫ: у меня тут АКМ и АУГ используют один тип боеприпасов, но это только для примера, разумеется. В нормальной программе надо передавать им весь рюкзак, а они сами должны найти в нем свои боеприпасы и сделать с ними все что надо.
А нахрена? То есть иногда такое дело надо, но очень редко. Если уж ты вызываешь все через 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 совершенно необязательно об этом ничего знать.
ЗЫ: у меня тут АКМ и АУГ используют один тип боеприпасов, но это только для примера, разумеется. В нормальной программе надо передавать им весь рюкзак, а они сами должны найти в нем свои боеприпасы и сделать с ними все что надо.
Миша Гурин
Cпасибо!
А в чем проблема? Если класс известен, берем объект и вызываем нужный метод.
Можно никак. А вместо этого сделать единый метод (допустим, Shoot(), если это о том) в BaseWeapon и унаследовать во всех дочерних, переопределив по-своему в каждом.
Миша Гурин
А если придется делать дробовик или лук, метод shoot уже не подойдет.
Похожие вопросы
- Вопрос программистам. ООП
- Ребят, вопрос по ООП в С++
- С++ пару вопросов о ООП
- Вопрос по ООП. Инкапсуляция, наследие, полиморфизм. Как понять все это чудо?
- Изучнние ООП - стоит ли сейчас?
- ООП. Стоит ли браться за ООП новичку в программировании?:
- ООП - зло. Ваше мнение.
- Объектно ориентированное программирование. (ООП)
- Что такое ООП для человека который не знает других парадигм
- Зачем нужно ООП?