using _260602_2;
using System;
using System.Drawing;
class Program()
{
static void Main()
{
Monster slime = new Slime("Slime", 10, 1);
Monster goblin = new Goblin("Goblin", 20, 2);
Monster[] monsters = new Monster[3];
monsters[0] = slime;
monsters[1] = goblin;
//슬라임이 공격
monsters[0].Attack(monsters[1]);
//고블린이 공격
monsters[1].Attack(monsters[0]);
monsters[0].PrintStatus();
Console.WriteLine("---------------------");
monsters[1].PrintStatus();
Console.WriteLine("---------------------");
//Monster dragon = new Dragon("Dragon", 100, 50);
//다운캐스팅 성공
if(monsters[0] is Slime s1)
{
monsters[0].PrintStatus();
}
else
{
Console.WriteLine("다운캐스팅 실패!");
}
//다운캐스팅 실패
if (monsters[1] is Slime s2)
{
monsters[0].PrintStatus();
}
else
{
Console.WriteLine("다운캐스팅 실패!");
}
Console.WriteLine("---------------------");
//slime이 Monster라면 m1에 대입.
Monster m1 = slime as Monster;
m1.PrintStatus();
}
}
using System;
namespace _260602_2
{
internal abstract class Monster
{
protected string name = "";
public string Name { get { return name; } set { name = value; } }
protected int hp;
public int Hp { get { return hp; } set { hp = value; } }
protected int damage;
public int Damage { get { return damage; } set { damage = value; } }
public Monster(string _name, int _hp, int _damage)
{
this.name = _name;
this.hp = _hp;
this.damage = _damage;
}
public void SetHp(int _hp)
{
hp = _hp;
}
public abstract void Attack(Monster monster);
public virtual void PrintStatus()
{
Console.WriteLine($"NAME : {name}");
Console.WriteLine($"HP : {hp}");
Console.WriteLine($"DAMAGE : {damage}");
}
public virtual void TakeDamage(int _damage)
{
int heal = hp - _damage;
SetHp(heal);
}
}
}
using _260602_2;
using System;
using System.Xml.Linq;
using static System.Net.Mime.MediaTypeNames;
namespace _260602_2
{
internal class Goblin : Monster
{
static private int maxHp;
public Goblin(string _name, int _hp, int _damage) : base(_name, _hp, _damage)
{
name = _name;
hp = _hp;
damage = _damage;
maxHp = _hp;
}
public override void Attack(Monster monster)
{
Console.WriteLine($"고블린의 공격 : {damage}");
monster.TakeDamage(damage);
}
public override void PrintStatus()
{
base.PrintStatus();
Console.WriteLine($"MaxHp :{maxHp}");
}
}
}
using _260602_2;
using System;
using System.Xml.Linq;
using static System.Net.Mime.MediaTypeNames;
namespace _260602_2
{
internal class Slime : Monster
{
static private int maxHp;
public Slime(string _name, int _hp, int _damage) : base(_name, _hp, _damage)
{
name = _name;
hp = _hp;
damage = _damage;
maxHp = _hp;
}
public override void Attack(Monster monster)
{
Console.WriteLine($"슬라임의 공격 : {damage}");
monster.TakeDamage(damage);
}
public override void PrintStatus()
{
base.PrintStatus();
Console.WriteLine($"MaxHp :{maxHp}");
}
}
}
Monster 클래스는 abstract로 구현.
Monster 클래스 안의 Attack을 abstract로 구현.
override를 활용해서 Slime과 Gobline 구현.
메인함수에 Monster배열을 선언하여
Monster[] 안에 제대로 업캐스팅하여 값이 들어갔는지 확인.
is , as 다운캐스팅 되는지 확인.