728x90
- 다형성 - virtual, override
- 객체 지향의 핵심
- 함수의 오버라이딩(재정의)
- 반복문으로 객체 관리
- virtual과 override 키워드 사용
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _083_override
{
class Super
{
protected int num;
public virtual void Print()
{
Console.WriteLine("num : {0}", num);
}
}
class AA : Super
{
public int a;
public override void Print()
{
base.Print();
Console.WriteLine("AA a : {0}", a);
}
}
class BB : Super
{
public int b;
public override void Print()
{
base.Print();
Console.WriteLine("BB b : {0}", b);
}
}
class Program
{
static void Main(string[] args)
{
Super super = new Super();
super.Print();
Super aa = new AA();
aa.Print();
Super bb = new BB();
bb.Print();
}
}
}
다형성을 활용하면 게임 내 캐릭터를 동작, 관리하기 용이하다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _084_override2
{
class Army
{
protected int _HP;
protected int _MP;
protected int _Speed;
protected int _Attack;
public virtual void Run()
{
Console.Write("{0}의 속도로", _Speed);
}
public virtual void Attack()
{
Console.WriteLine();
if(this is Healer)
{
Console.Write("[마법 공격력 - {0}]으로 ", _Attack * _MP);
}
else
{
Console.Write("[공격력 - {0}]으로 ", _Attack);
}
}
}
class Barbarian : Army
{
public Barbarian()
{
_HP = 100;
_MP = 0;
_Speed = 100;
_Attack = 100;
}
public override void Run()
{
base.Run();
Console.WriteLine("Barbarian 달려갑니다. ");
}
public override void Attack()
{
base.Attack();
Console.WriteLine("Barbarian이 칼로 공격!!! ");
}
}
class Giant : Army
{
public Giant()
{
_HP = 200;
_MP = 0;
_Speed = 10;
_Attack = 200;
}
public override void Run()
{
base.Run();
Console.WriteLine("Giant 달려갑니다. ");
}
public override void Attack()
{
base.Attack();
Console.WriteLine("Giant 공격!!! ");
}
}
class Healer : Army
{
public Healer()
{
_HP = 50;
_MP = 100;
_Speed = 200;
_Attack = 10;
}
public override void Run()
{
base.Run();
Console.WriteLine("Healer 날아갑니다. ", _Speed);
}
public override void Attack()
{
base.Attack();
Console.WriteLine("Healer 마법 공격!!! ");
}
}
class Program
{
static void Main(string[] args)
{
Army[] arrArmys = new Army[10];
arrArmys[0] = new Barbarian();
arrArmys[1] = new Giant();
arrArmys[2] = new Healer();
arrArmys[3] = new Healer();
arrArmys[4] = new Giant();
for(int i = 0; i < arrArmys.Length; i++)
{
if(null != arrArmys[i])
{
arrArmys[i].Run();
System.Threading.Thread.Sleep(1000);
}
}
System.Threading.Thread.Sleep(1000);
for(int i = 0; i < arrArmys.Length; i++)
{
if(null != arrArmys[i])
{
arrArmys[i].Attack();
System.Threading.Thread.Sleep(1000);
}
}
}
}
}
- sealed 키워드 : 상속, 재정의 불가
- 클래스 sealed
sealed class CC
class DD : CC //CC 클래스가 sealed라 오류
- 함수 sealed
class AAA
public virtual void PrintParent()
class BBB : AAA
public sealed override void PrintParent()
class CCC : BBB
public override void PrintParent()
- 확장 메소드
- this 키워드
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _087_extension
{
class AA
{
public void View(string str)
{
Console.WriteLine("PrintAA {0}", str);
}
}
static class Util
{
public static void Print(this AA aa, string str)
{
aa.View(str);
}
public static void Sum(this int a)
{
Console.WriteLine("{0} + {1} = {0}", a, a, a + a);
}
}
class Program
{
static void Main(string[] args)
{
AA aa = new AA();
Util.Print(aa, "Hello");
aa.Print("Hello"); //이게 가능
Util.Sum(10);
10.Sum(); //이게 가능
}
}
}
- 클래스 vs 구조체
class | struct | |
특징 | 참조 타입(Reference) - 힙에 생성 | 값 타입(Value) - 스택에 생성 |
사용 | new 연산자 | new 연산자 없는 생성 가능 |
생성자 | 파라미터 없는 생성자 가능 | 반드시 파라미터가 있어야 함 |
- 자료의 크기가 작을 때
- 구조가 단순할 때
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _085_struct
{
struct AA
{
public int x;
public int y;
//public AA() { } //오류 : 파라미터 없음
public AA(int x, int y)
{
this.x = x;
this.y = y;
}
public void Print()
{
Console.WriteLine("x : {0}, y : {1}", x, y);
}
}
class Program
{
static void Main(string[] args)
{
AA aa = new AA(10, 20);
aa.x = 100;
aa.Print();
AA aaa;
aaa.x = 100;
aaa.y = 200;
aaa.Print();
AA copyAA = aa; //value type
copyAA.x = 1000;
copyAA.y = 2000;
copyAA.Print();
aa.Print();
}
}
}
728x90
'게임 프로그래밍 > C#' 카테고리의 다른 글
C# RPG게임 예제 코드 (0) | 2021.12.20 |
---|---|
C# 인터페이스, 추상 클래스, 프로퍼티 (0) | 2021.12.19 |
C# 클래스 상속, is/as 키워드 (0) | 2021.12.16 |
C# 클래스 static & this (0) | 2021.12.15 |
C# 클래스(접근 한정자, 생성자, 소멸자) (0) | 2021.12.15 |