管窥WOWUIInterface代码

管窥WOWUIInterface代码


Template 模板

UIInterface中预设了一些的基础|通用的Template来到处使用,保证了各处功能的统一和制作中的复用

事件
  1. 游戏事件
    UIInterface只是GameLogic外边的一层皮,GameLogic是UIInterface的核,所有的游戏数据由事件通知到这层皮上面,UIInterface再通过API获取游戏数据来新事件自己的功能.
  2. 用户输入事件
    和其他一样
继承实现

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那一篇.
对于习惯于JAVAC#这样接口实现变相多重继承的语言,总是有人说Mixin是带有默认实现的接口,在我理解来,Mixin接口显然是有区别的:

  1. 接口不能带有字段,只能有函数成员
public interface foo
{
    int value; // error  接口不能带有字段,而Mixin则可以.Mixin意味着将`父类`的东西都包含到对象中
}

  1. 接口不能保证单一
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

函数保护
  1. 在第三方代码中,对Game核心功能代码做了保护,无法在第三方代码中执行受保护的函数
  2. 在UI上也做了一些保护,在战斗中一些界面会和非战斗中行为不一致
posted @ 2020-11-25 18:54  Fallever  阅读(108)  评论(0编辑  收藏  举报