C#
120
Вклад в тег
<h1 class="header">Заголовок</h1>
<article class="article">
<h1 class="header">Заголовок</h1>
<p>Текст текст текст</p>
</article>
<aside class="incut">
<h1 class="header">Заголовок</h1>
<p>Текст текст текст</p>
</aside>
.header {font-size: 2em; padding-bottom: 1.5em;}
.incut .header {text-decoration: italic;}
<article class="b-article">
<h1 class="b-article__header">Заголовок</h1>
<p>Текст текст текст</p>
</article>
<aside class="b-article b-article__incut">
<h1 class="b-article__header b-article__header_incut">Заголовок</h1>
<p>Текст текст текст</p>
</aside>
.b-article__header {font-size: 2em; padding-bottom: 1.5em;}
.b-article__header_incut {text-decoration: italic;}
public enum DamageType { Melee, Range, Magic }
public class Monster
{
public double Health { get; private set; }
public double MeleeDamage { get; private set; }
public double RangeDamage { get; private set; }
public double MagicDamage { get; private set; }
public DamageType FavoriteDamageType { get; private set; }
public Monster(double health, double meleeDamage, double rangeDamage, double magicDamage, DamageType favoriteDamageType)
{
Health = health;
MeleeDamage = meleeDamage;
RangeDamage = rangeDamage;
MagicDamage = magicDamage;
FavoriteDamageType = favoriteDamageType;
}
public void AttackTo(Monster monster, DamageType damageType)
{
switch (damageType) // используется switch
{
case MonsterType.Melee: monster.Health -= MeleeDamage; break;
case MonsterType.Range: monster.Health -= RangeDamage; break;
case MonsterType.Magic: monster.Health -= MagicDamage; break;
}
}
public void AttackTo(Monster monster)
{
AttackTo(monster, FavoriteDamageType);
}
}
public class Monster
{
public double Health { get; set; }
public double MeleeDamage { get; private set; }
public double RangeDamage { get; private set; }
public double MagicDamage { get; private set; }
public IDamageStrategy FavoriteDamageStrategy { get; private set; }
public Monster(double health, double meleeDamage, double rangeDamage, double magicDamage, IDamageStrategy favoriteDamageStrategy)
{
Health = health;
MeleeDamage = meleeDamage;
RangeDamage = rangeDamage;
MagicDamage = magicDamage;
FavoriteDamageStrategy = favoriteDamageStrategy;
}
public void AttackTo(Monster monster, IDamageStrategy damageStrategy)
{
damageStrategy.Attack(this, monster); // не используется switch
}
public void AttackTo(Monster monster)
{
AttackTo(monster, FavoriteDamageStrategy);
}
}
public interface IDamageStrategy
{
void Attack(Monster attacker, Monster defender);
}
public class MeleeDamageStrategy : IDamageStrategy
{
public void Attack(Monster attacker, Monster defender)
{
defender.Health -= attacker.MeleeDamage;
}
}
public class RangeDamageStrategy : IDamageStrategy
{
public void Attack(Monster attacker, Monster defender)
{
defender.Health -= attacker.RangeDamage;
}
}
public class MagicDamageStrategy : IDamageStrategy
{
public void Attack(Monster attacker, Monster defender)
{
defender.Health -= attacker.MagicDamage;
}
}
class Animal {
public void Info() { Console.WriteLine("Animal"); }
public virtual void Say() { Console.WriteLine("Nothing to say"); }
}
class Cat : Animal {
public void Info() { Console.WriteLine("Cat"); }
public override void Say() { Console.WriteLine("Meow"); }
}
class Dog : Animal {
public void Info() { Console.WriteLine("Dog"); }
public override void Say() { Console.WriteLine("Woof"); }
}
Dog dog1 = new Dog();
Animal dog2 = new Dog();
// Не виртуальный метод - вызовется метод класса, указанного у переменной
dog1.Info(); // напишет Dog
dog2.Info(); // напишет Animal
// Виртуальный метод - вызовется метод класса, которого переменная реально имеет
dog1.Say(); // напишет Woof
dog2.Say(); // напишет Woof
Animal[] animals = new Animal[10];
FillAnimals(animals); // заполним массив вперемешку собаками и кошками
foreach (var animal in animals) animal.Say(); // вызовется правильный метод
// У невиртуальных методов так сделать нельзя! Полиморфизм в действии
Animal animal = new Dog();