Вот то, что я имею до сих пор:
namespace Strategy
{
interface IWeaponBehavior
{
void UseWeapon();
}
}
namespace Strategy
{
class Knife : IWeaponBehavior
{
public void UseWeapon()
{
Console.WriteLine("You used the knife to slash the enemy! SLASH SLASH!");
}
}
}
namespace Strategy
{
class Pan : IWeaponBehavior
{
public void UseWeapon()
{
Console.WriteLine("You use the pan! 100% Adamantium power! BONG!");
}
}
}
Теперь, если у меня есть суперкласс Character.cs. как тот суперкласс может реализовать weaponbehavior так, чтобы дочерние классы могли быть более конкретными.
namespace Strategy
{
class Character
{
public IWeaponBehavior weapon;
public Character(IWeaponBehavior specificWeapon)
{
weapon = specificWeapon;
}
}
}
namespace Strategy
{
class Thief : Character
{
}
}
Как я могу реализовать это? Я очень смущен на том, каков фактический код должен быть.
Я знаю, что это могло бы спрашивать слишком много, но если Вы могли бы написать фактический код, таким образом, я мог изучить его, который будет очень хорош из Вас парни. Я учусь путем наблюдения кода.:P Многие люди могли извлечь выгоду из этого вопроса.
Использовать внедрение зависимостей в классе Символ
?
public class Character
{
public Character(IWeaponBehavior weapon)
{
this.weapon = weapon;
}
public void Attack()
{
weapon.UseWeapon();
}
IWeaponBehavior weapon;
}
public class Princess: Character
{
public Princess() : base(new Pan()) { }
}
public class Thief: Character
{
public Thief() : base(new Knife()) { }
}
...
Princess p = new Princess();
Thief t = new Thief();
p.Attack(); // pan
t.Attack(); // knife
Отредактировано по запросу.
public class Character { IWeaponBehavior Weapon; } public class Princess : Character { Weapon = new Pan(); } public class Thief : Character { Weapon = new Knife(); }
Взгляните на внедрение зависимостей, а затем также посмотрите на инверсию управления.
В TekPub есть отличная бесплатная серия по этим двум идеям, в которой используется образец, очень похожий на ваш. Это должно помочь вам с конкретным образцом. : -)
http: // tekpub.com / view / concepts / 1
Пример кода из видео:
class Samurai {
IWeapon _weapon;
public Samurai() {
_weapon = new Sword();
}
public Samurai(IWeapon weapon) {
_weapon = weapon;
}
public void Attack(string target) {
_weapon.Hit(target);
}
}
Выше показан DI (с конструктором IWeapon). Теперь, добавив инверсию управления, вы получите еще больший контроль.
Используя контейнер IOC, вы сможете управлять IWeapon посредством инъекции, а не в самом классе.
В видео используется NInject как IOC и показано, как можно исключить конструктор IWeapon и получить контроль над классом и всеми классами, которым необходимо использовать IWeapon для использования того, что вы хотите, в одной области расположения / конфигурации.
Пример из видео:
class WarriorModule: NinjectModule {
public override void Load() {
Bind<IWarrior>().To<Samurai>();
Bind<IWeapon>().To<Sword>();
}
Вышеупомянутая конфигурация сообщает NInject, что всякий раз, когда он встречает IWarrior использовать Samurai, и всякий раз, когда он призывает IWeapon использовать Sword.
Видео продолжает объяснять, как это небольшое изменение увеличивает вашу гибкость. Он добавляет еще один модуль для Самурии, использующей оружие дальнего боя и т. Д.
Вы можете изменить их по необходимости / желанию.
Вот очень конкретная статья об использовании этого шаблона в C #: http://www.lowendahl.net/showShout.aspx?id=115
Если у всех ваших персонажей есть собственное определенное оружие, вам на самом деле не нужно использовать шаблон стратегии. Вы можете использовать простой полиморфизм. Но шаблон стратегии в любом случае мог бы быть чище.
Вам просто нужно инициализировать оружие:
public class Character
{
IWeapenBehavior weapon;
public Attack()
{
weapon.UseWeapon();
}
}
public class Thief : Character
{
Thief()
{
weapon = new Knife();
}
}
В коде, который управляет вашими персонажами, вы можете вызвать метод Attack ()
.
Есть несколько вариантов. На самом деле вы спрашиваете: "Как конкретный персонаж должен знать, какое оружие использовать?".
Вы можете либо создать фабрику персонажей, которая будет создавать и вводить нужный тип оружия в персонажа (это звучит неправильно :) ), либо позволить конструктору конкретного персонажа позаботиться о создании оружия.
class Character
{
private IWeaponBehavior _weapon;
// Constructor
public Character(IWeaponBehavior strategy)
{
this._weapon = strategy;
}
public void WeaponInterface()
{
_weapon.UseWeapon();
}
}