聊聊UE的ThisClass
UE有个很有意思的设计ThisClass,你肯定看过这样的代码:
voidAMyActor::BeginPlay(){Super::BeginPlay();ThisClass::InternalReset();TSharedPtr<ThisClass>Self=MakeShared<ThisClass>();}ThisClass在UE中作为类别名使用,相比较this关键字它可以调用静态成员,而又无需写全类名,这作为一种设计风格广泛在UE代码中出现。
1.简化类名&重构
该设计可起到简化类名的目的
TSharedPtr<FMyExtremelyLongGameplayWidget>Ptr=MakeShared<FMyExtremelyLongGameplayWidget>();// 简洁优雅TSharedPtr<ThisClass>Ptr=MakeShared<ThisClass>();当重构时,也可做到较少改动。
2.对抗 C++ 的“名称隐藏”(Name Hiding)
这是 C++ 开发者容易踩的深坑。当子类重载了父类的同名函数时,this->Func() 可能导致意想不到的调用歧义。
classABase{public:voidLog(intCode);};classADerived:publicABase{public:voidLog();};// 隐藏了基类的 Log(int)voidADerived::Test(){// this->Log(1); // 编译错误!因为 ADerived::Log() 隐藏了父类版本ABase::Log(1);// 硬性指定父类版本——可行但繁琐ThisClass::Log();// 明确指定:我要调用当前类定义的 Log(),忽略父类干扰}3.仅限类内部作用域
ThisClass 的 typedef 定义在类作用域内,无法在类外部使用。在 .cpp 文件的全局函数中,仍需写完整的类名。