管窥WOWUIInterface代码
Template 模板
UIInterface中预设了一些的基础|通用的Template来到处使用,保证了各处功能的统一和制作中的复用
事件
- 游戏事件
UIInterface只是GameLogic外边的一层皮,GameLogic是UIInterface的核,所有的游戏数据由事件通知到这层皮上面,UIInterface再通过API获取游戏数据来新事件自己的功能. - 用户输入事件
和其他一样
继承实现
Lua代码中以Mixin
的方式实现继承,代码只是简单的拷贝成员
到对象的域中
.代码如下:
-- where ... are the mixins to mixin
function Mixin(object, ...)
for i = 1, select("#", ...) do
local mixin = select(i, ...);
for k, v in pairs(mixin) do
object[k] = v;
end
end
return object;
end
-- where ... are the mixins to mixin
function CreateFromMixins(...)
return Mixin({}, ...)
end
关于正确的理解Mixin的含义可以阅读下面的链接,尤其应该阅读Dart语言阐述Mixin那一篇.
对于习惯于JAVA
和C#
这样接口实现变相多重继承的语言,总是有人说Mixin
是带有默认实现的接口
,在我理解来,Mixin
和接口
显然是有区别的:
- 接口不能带有字段,只能有函数成员
public interface foo
{
int value; // error 接口不能带有字段,而Mixin则可以.Mixin意味着将`父类`的东西都包含到对象中
}
- 接口不能保证单一
public interface IHander1
{
void OnMsg();
}
public interface IHander2
{
int OnMsg(int a);
}
public class Obj : IHander1, IHander2
{
public void OnMsg()
{
}
public int OnMsg(int a) // 需要分别实现2个接口, 且如果要是俩个接口的前面在特定情况下一致还实现不了.
{ // Mixin则不会,混入的方法是唯一的.按线性覆盖
return 0;
}
}
总之,Mixin
和接口
显然不是同样的东西,虽然代码上可以互相代替,但是正确理解概念是很重要的,不同的概念代表了不同思考方式.
接口
的滥用也是很难受的一件事,特别是有的接口看起来就想对象一样(无论从命名还是实现 IFucker).
- 继承描述的关系是: is-a, 描述的是A is B 的关系
- 接口描述的是: able, 描述的是不同类之间有相同的能力,是共性
- Mixin是: included, 描述的包含关系,A include b,c,d
引发:Mixin是否更贴合组合的概念?假如将[译]Dart | 什么是Mixin文章中类名改下名字
walker
=>foot
, swimmer
=> fin
, flyer
=> wing
,修改后感觉理解起来太像组合了.只能不能去Mixin
...
Wiki - Mixin
知乎 - Mixin是什么概念?
[译]Dart | 什么是Mixin
函数保护
- 在第三方代码中,对Game核心功能代码做了保护,无法在第三方代码中执行受保护的函数
- 在UI上也做了一些保护,在战斗中一些界面会和非战斗中行为不一致