SectionTwoReview
인터페이스, 컴포지션
- 클래스 설계
- MyGameInstance: 객체 생성, 로그를 통해 동작 확인.
- Person
- 멤버: Name, Subscribe 컴포지션, Getter(), Setter().
- WatchInterface
- Subscriber: Person 상속, WatchInterface 상속.
- Staff: Person 상속
- 목표
- 인테페이스를 사용해서 프레임웍을 구축, 컴포지션 기법 사용.
#include "MyGameInstance.h"
#include "Subscriber.h"
#include "Staff.h"
#include "Subscribe.h"
UMyGameInstance::UMyGameInstance()
{
OTTName = TEXT("이OTT");
}
void UMyGameInstance::Init()
{
Super::Init();
OTTName = TEXT("넷플릭스");
USubscriber* Subscriber1 = NewObject<USubscriber>();
Subscriber1->SetName(TEXT("이구독자1"));
USubscriber* Subscriber2 = NewObject<USubscriber>();
Subscriber2->SetName(TEXT("이구독자2"));
UStaff* Staff1 = NewObject<UStaff>();
Staff1->SetName(TEXT("이관리자1"));
UE_LOG(LogTemp, Log, TEXT("============================"));
IWatchInterface* WatchInterface = Cast<IWatchInterface>(Subscriber1);
if (WatchInterface)
{
const USubscribe* OwnSubscribe = Subscriber1->GetSubscribe();
ESubscribeType SubscribeType = OwnSubscribe->GetSubscribeType();
UE_LOG(LogTemp, Log, TEXT("%s님이 소유한 구독 종류 %d"), *Subscriber1->GetName(), SubscribeType);
UE_LOG(LogTemp, Log, TEXT("%s님은 콘텐츠를 시청할 수 있습니다."), *Subscriber1->GetName());
WatchInterface->DoWatch();
}
WatchInterface = Cast<IWatchInterface>(Subscriber2);
if (WatchInterface)
{
const USubscribe* OwnSubscribe = Subscriber2->GetSubscribe();
ESubscribeType SubscribeType = OwnSubscribe->GetSubscribeType();
const UEnum* SubscribeEnumType = FindObject<UEnum>(nullptr, TEXT("/Script/SectionTwoReview.ESubscribeType"));
check(SubscribeEnumType);
FString SubscribeMetaData = SubscribeEnumType->GetDisplayNameTextByValue((int64)SubscribeType).ToString();
UE_LOG(LogTemp, Log, TEXT("%s님이 소유한 구독 종류 %s"), *Subscriber1->GetName(), *SubscribeMetaData);
UE_LOG(LogTemp, Log, TEXT("%s님은 콘텐츠를 시청할 수 있습니다."), *Subscriber2->GetName());
WatchInterface->DoWatch();
}
WatchInterface = Cast<IWatchInterface>(Staff1);
if (WatchInterface)
{
UE_LOG(LogTemp, Log, TEXT("%s님은 콘텐츠를 시청할 수 있습니다."), *Staff1->GetName());
WatchInterface->DoWatch();
}
else
{
UE_LOG(LogTemp, Log, TEXT("%s님은 콘텐츠를 시청할 수 없습니다."), *Staff1->GetName());
}
UE_LOG(LogTemp, Log, TEXT("============================"));
}

델리게이트
- 클래스 설계
- SubscribeInfo: 콘텐츠 제작자.
- MyGameInstance: 발행자.
- Subscriber: 구독자.
- Person(Subscriber)는 SubscribeInfo에 대한 헤더를 포함하지 않고, SubscribeInfo도 마찬가지고 cpp나 헤더에 Person(Subscriber) 관련된 헤더를 포함하지 않는다.
- 목표
- 시스템(SubscriberInfo)에서 구독 정보를 변경하면은 알림 구독한 구독자들에게 변경 내용을 자동으로 전달.
#include "MyGameInstance.h"
#include "Subscriber.h"
#include "Staff.h"
#include "SubscribeInfo.h"
UMyGameInstance::UMyGameInstance()
{
OTTName = TEXT("이OTT");
}
void UMyGameInstance::Init()
{
Super::Init();
OTTName = TEXT("넷플릭스");
SubscribeInfo = NewObject<USubscribeInfo>(this);
UE_LOG(LogTemp, Log, TEXT("============================"));
USubscriber* Subscriber1 = NewObject<USubscriber>();
Subscriber1->SetName(TEXT("구독자1"));
USubscriber* Subscriber2 = NewObject<USubscriber>();
Subscriber2->SetName(TEXT("구독자2"));
USubscriber* Subscriber3 = NewObject<USubscriber>();
Subscriber3->SetName(TEXT("구독자3"));
SubscribeInfo->OnChanged.AddUObject(Subscriber1, &USubscriber::GetNotification);
SubscribeInfo->OnChanged.AddUObject(Subscriber2, &USubscriber::GetNotification);
SubscribeInfo->OnChanged.AddUObject(Subscriber3, &USubscriber::GetNotification);
SubscribeInfo->ChangeSubscribeInfo(OTTName, TEXT("변경된 구독 정보"));
UE_LOG(LogTemp, Log, TEXT("============================"));
}
