bible (앞을 대문자로 쓰지않음 그러면 진짜 성경,,ㅎ)
GOF 디자인패턴 - 좋은책!
coder -> programmer -> developer -> architect
[템플릿 메서드 패턴]
- 가상함수 그 자체
* params
가변인자 만들기 params!!
- Marine과 Firebat은 바로위에 virtual 함수로 실행이되고 zealot 같은경우에는 override 함수가 자동으로 실행됨.!
- program.cs -> 인자를 이런식으로 넣어주어야함
static void TakeRandomDamage(Unit unit)
{
//unit.TakeDamage(_random.Next(1, 5));
unit.TakeMultipleDamages(_random.Next(1, 5), _random.Next(1, 5), _random.Next(1, 5));
Console.WriteLine(unit.ToText());
}
- c#을 바탕으로 파이썬을 짜본 코드의 모습
from abc import ABCMeta, abstractmethod
import random
class Unit(metaclass=ABCMeta) :
HP = int()
@abstractmethod
def ToText(self) :
pass
def TakeDamage(self, damage) :
while damage > 0:
damage -= 1
self.HP -= 1
def TakeMultipleDamage(self, *damages) :
for i in damages :
self.TakeDamage(i)
class Firebat(Unit) :
def __init__(self) :
self.HP = 60
def ToText(self) :
print("I am a firebat and I have {0} HP(s)".format(self.HP))
class Marine(Unit) :
def __init__(self) :
self.HP = 50
def ToText(self) :
print("I am a Marine and I have {0} HP(s)".format(self.HP))
class Zealot(Unit) :
def __init__(self) :
self.HP = 100
self.Shield = 50
def ToText(self) :
print("I am a Zealot and I have {0} HP(s) and I have {1} shield(s)".format(self.HP, self.Shield))
def TakeDamage(self, damage) :
while damage > 0:
if self.Shield == 0:
break
damage -= 1
self.Shield -= 1
super().TakeDamage(damage)
class FakeCraft :
def __init__(self):
self._units = []
def TakeRandomDamage(self) :
# self.damage = random.randrange(1,6)
for i in self._units:
i.TakeMultipleDamage(random.randrange(1,6), random.randrange(1,6), random.randrange(1,6))
i.ToText()
fakecraft = FakeCraft()
fakecraft._units.append(Marine())
fakecraft._units.append(Firebat())
fakecraft._units.append(Firebat())
fakecraft._units.append(Zealot())
fakecraft.TakeRandomDamage()
클래스 이름은 대부분 명사 혹은 명사구가 되어야함
- 제네릭
정렬하는 동작을 파라미터로 넣자
* delegate (대리자)
- 대리자의 내용은 함수의 시그니처를 말함.
.
Type - 1. class / 2. struct / 3. delegate / 4. enum
* c# 1.0 같았으면 아래사진에 주석친것과 같이 선언해줬어야 하지만 2.0부터는 Ascending만 파라미터로 넣어줘도 가능
(2.0 + 익명함수 , 3.0 + 람다식(익명함수를 완전히 대체할 수 있음)
* 이 이후에 또 업데이트로 func deletate, action delegate 두가지를 쓸 수 있음
action 은 반환값이 없음! func는 반환값이 있음 (out은 무시해도 됨)
정리하자면 public delegate bool~~ 어쩌구 하는 delegate를 쓰지 않아도됨 즉,
public static void Sort(int[] ar, Func<int, int, bool>) (세번째 매개변수는 반환값을 써주어야함!)
또다른예)
Foo(PrintDouble) 은 함수자체를 넘기는거기때문에 ()를 쓸 필요가 없음!
지금은 업데이트 되었음 - 아래와 같이 사용가능! Action<int> f = PrintDouble;
자, 여기까지가 delegate의 기본이해 - 이걸 알아야 event를 할 수있음!
공식적으로 c#은 멀티 패러다임 언어라고 부르기도 함.
linq
놀라운건 이 query가 데이터베이스안에 있다는 것,,,.,.,.,..,,.,..,,.,, - 울어야함
Q. 대리자가 꼭 필요한 상황은 어떤 상황인가요
비교하는 방법, 정렬 기준을 자기가 임의로 고정시켜놓는것은 너무 문제가 됨 정렬기준도 전달받고싶을때 (데이터 정렬동작) 즉, 함수를 전달받기 위해서는 우리는 대리자를 사용함 (delegate)
* 유닛이 죽었을때
- 그러나 문제있는 코드
- windform으로 만들어보자!
정석은 UI와 엔진을 분리하는것이 좋음!!!!!!!!!!!!!!!!!!!!!!!!!!
- 그래야 WINFORM과 같은 다른 프로젝트에서도 로직이 재사용이 가능함
분기 / 07-대리자
FakeCraftLogic 에들어가면 실행파일이 없음! 말그대로 그냥 로직만 모이는것임 유닛, 질럿 등의 클래스를 다 이동 시켜줌!!!
* 여기서 우리는 왜 internal이 필요한지 알게됨!!!!!!!!!!!!!
- 생략되어있으면 internal 임 고로 다 public으로 직접 고쳐주어야함!1
- 퍼블릭으로 바꿔주는 모습
- 이제 winform에서 해보기
- 마린 객체를 추가하기위해서 참조에 Logic 프로젝트를 또 추가해줌
- 윈폼만들기
- 시작 프로젝트로 설정하기
* 지금 winform 이야기를 왜하냐, 유닛이 죽었을때의 이벤트 처리를 하기위해~
자기가 hp가 0이 되었을 때 UI에 띄울 수는 없으나 함수를 대리자로 선정할 수 는 있음!
- 반환값이 없기때문에 Action <int> 이런식으로 대리자를 정의함
- 이쪽에 Console.WriteLine 을 쓰게되면 이제 콘솔에만 국한되어버리는 코드가됨 그러므로 cw의 대리자를 가져오는것
- winform에서 고치기
* 람다식이 어려우면 대리자 사용
- 실행시켜본 결과
분기 / 08-이벤트
- 이벤트는 등록하거나 해제를 한다고 말함
- 문법적으로는 multicast event를 delegate라고 함
1.
2. 이벤트 핸들러 만들기
3.
4. OnDead(Damage) 하나로 끗
5.
* ㅠㅠ 이벤트 생성 툴
* 여러가지 이벤트 추가해보기
1.
2.
3. 위에서 true로 바꾸어 줬기 때문에 cancle하면 밑에를 실행하지 않고 넘어가도록
4. 결과
* 두번씩 나오기 때문에 아래처럼 고쳐주어야함 - 왜,,,? 살펴보기
* 죽은 유닛 이벤트 출력하기
'Archive' 카테고리의 다른 글
0906 10-인터페이스 (0) | 2019.09.06 |
---|---|
0906 09-가상메서드-추상메서드 (0) | 2019.09.06 |
0905 FackCraft (0) | 2019.09.05 |
0905 서버프로그래밍 기초 2 (0) | 2019.09.05 |
0904 서버프로그래밍 기초지식 (0) | 2019.09.04 |