1. 程式人生 > >Lua 介面(Interface)實現方式之一

Lua 介面(Interface)實現方式之一

interface是面向物件程式語言中介面操作的關鍵字,功能是把所需成員組合起來,以封裝一定功能的集合。它好比一個模板,在其中定義了物件必須實現的成員,通過類或結構來實現它。介面不能包含成員的任何程式碼,只定義成員本身。介面成員的具體程式碼由實現介面的類提供。介面使用interface關鍵字進行宣告。

在Lua中也可以封裝這種類似的Interface。

function BasePanel:ctor(options)
    ro(self):addBehavior("Logic.behaviors.BindableBehavior"):exportMethods()
end
local romt = {}
romt.__call = function(self, target)
    if target then
        return BehaviorObject.extend(target)
    end
    printError("ro() - invalid target")
end
setmetatable(ro, romt)

local BindableBehavior = class("BindableBehavior",ro.Behavior)

function BindableBehavior:ctor()
    self.__items = {}
    BindableBehavior.super.ctor(self,"BindableBehavior")
end

function BindableBehavior:bind_text(scope,key,text,format,tagname)
    local item = scope:bind_text(key,text,format,tagname)
    table.insert(self.__items,item)
    return item
end

function BindableBehavior:bind_object(scope,key,object,format,tagname)
    local item = scope:bind_object(key,object,format,tagname)
    table.insert(self.__items,item)
    return item
end

function BindableBehavior:bind_func(scope,key,func,format,tagname)
    local item = scope:bind_func(key,func,format,tagname)
    table.insert(self.__items,item)
    return item
end

function BindableBehavior:unbind_point(object)
    for i=#self.__items,1,-1 do
        local item = self.__items[i]
        if item.custom ~= nil and item.custom == object then
            item:unbind("unbind_point")
            table.remove(self.__items,i)
            break
        end
    end
end

function BindableBehavior:has_bind_point(object)
    for i=#self.__items,1,-1 do
        local item = self.__items[i]
        if item.custom == object then
            return item
        end
    end
    return false
end

function BindableBehavior:bind_point(key,object,condition,tagname)
    if key == nil or object == nil then
        log("bind_point error =>"..tostring(key),"BINDING")
        return
    end
    local function on_point(k,v)
        if v == 0 then
            if object ~= nil and object.gameObject ~= nil then
                object.gameObject:SetActive(false)
            end
        else
            if object ~= nil and object.gameObject ~= nil then
                if not condition or ro.mu:isOpen(condition,false) then
                    object.gameObject:SetActive(true)
                else
                    object.gameObject:SetActive(false)
                end
            end
        end
    end
    local points = ro.user.role.points
    self:unbind_point(object)
    local item = points:bind_func(key,on_point,nil,tagname)
    item.custom = object
    table.insert(self.__items,item)
    return item
end

function BindableBehavior:update_bindings()
    if #self.__items > 0 then
        --log("update_bindings:"..#self.__items,"BIND")
        for i,item in ipairs(self.__items) do
            item:update()
        end
    end
end

function BindableBehavior:clear_bindings()
    --log(self:getTarget().__cname.."=>clear_bindings","BINDING")
    for i,item in ipairs(self.__items) do
        item:unbind()
    end
    self.__items = {}
end

function BindableBehavior:exportMethods()
    self:exportMethods_(
    {
        "bind_text",
        "bind_object",
        "bind_func",
        "bind_point",
        "unbind_point",
        "has_bind_point",
        "update_bindings",
        "clear_bindings",
    })
    return self.target_
end
return BindableBehavior

local Registry = require("Logic.Registry")
local BehaviorObject = {}
function BehaviorObject.extend(target)
    if target.extendcomponent == nil then
        target.extendcomponent = true
        target.components_ = {}
        function target:checkBehavior(name)
            return self.components_[name] ~= nil
        end

        function target:printBehaviors(tag)
            tag = tag or ""
            for k,v in pairs(self.components_) do
                print(tostring(self.__cname).."===>"..tostring(tag).."===>",k)
            end
        end

        function target:addBehavior(name,auto_export)
            local component
            if not self:checkBehavior(name) then
                component = Registry.newObject(name)
                self.components_[name] = component
                component:bind_(self)
                if auto_export then
                    component:exportMethods()
                end
            else
                component = self:getBehavior(name)
            end
            return component
        end

        function target:removeBehavior(name)
            local component = self.components_[name]
            if component then component:unbind_() end
            self.components_[name] = nil
        end

        function target:getBehavior(name)
            return self.components_[name]
        end
    end
    return target
end
return BehaviorObject

local Registry = class("Registry")

Registry.classes_ = {}
Registry.objects_ = {}

function Registry.add(cls, name)
    assert(type(cls) == "table" and cls.__cname ~= nil, "Registry.add() - invalid class")
    if not name then name = cls.__cname end
    if Registry.classes_[name] == nil then
        Registry.classes_[name] = cls
    else
        print(string.format("Registry.add() - class \"%s\" already exists", tostring(name)))
    end
end

function Registry.remove(name)
    assert(Registry.classes_[name] ~= nil, string.format("Registry.remove() - class \"%s\" not found", name))
    Registry.classes_[name] = nil
end

function Registry.exists(name)
    return Registry.classes_[name] ~= nil
end

function Registry.newObject(name, ...)
    local cls = Registry.classes_[name]
    if not cls then
        -- auto load
        pcall(function()
            cls = require(name)
            Registry.add(cls, name)
        end)
    end
    assert(cls ~= nil, string.format("Registry.newObject() - invalid class \"%s\"", tostring(name)))
    return cls.new(...)
end

function Registry.setObject(object, name)
    assert(Registry.objects_[name] == nil, string.format("Registry.setObject() - object \"%s\" already exists", tostring(name)))
    assert(object ~= nil, "Registry.setObject() - object \"%s\" is nil", tostring(name))
    Registry.objects_[name] = object
end

function Registry.getObject(name)
    assert(Registry.objects_[name] ~= nil, string.format("Registry.getObject() - object \"%s\" not exists", tostring(name)))
    return Registry.objects_[name]
end

function Registry.removeObject(name)
    assert(Registry.objects_[name] ~= nil, string.format("Registry.removeObject() - object \"%s\" not exists", tostring(name)))
    Registry.objects_[name] = nil
end

function Registry.isObjectExists(name)
    return Registry.objects_[name] ~= nil
end

return Registry

相關推薦

Lua 介面Interface實現方式之一

interface是面向物件程式語言中介面操作的關鍵字,功能是把所需成員組合起來,以封裝一定功能的集合。它好比一個模板,在其中定義了物件必須實現的成員,通過類或結構來實現它。介面不能包含成員的任何程式碼,只定義成員本身。介面成員的具體程式碼由實現介面的類提供。介面使用inte

介面interface,實現class,繼承(extends),實現implements

介面類: @Service public interface AppCertMsgService { public Map<String, Object> saveCardMsg(AppCertMsg appCertMsg, String channe

java中介面interface及使用方法和注意事項

1、介面:一種把類抽象的更徹底,接口裡只能包含抽象方法的“特殊類”。介面不關心類的內部狀態資料,定義的是一批類所遵守的規範。(它只規定這批類裡必須提供某些方法,提供這些方法就可以滿足實際要求)。 在JAVA程式語言中是一個抽象型別,是抽象方法的集合,介面通常以interface來宣告。一個類通過

java 介面interface的應用詳解

java 介面(interface)的應用詳解 1.java 介面(interface) 2.java 介面(interface)使用的知識點 3.介面使用總結 4.結果的應用和 實現介面的匿名類物件 1.

抽象類abstract class介面interface有什麼異同?

抽象類和介面都不能夠例項化,但可以定義抽象類和介面型別的引用。一個類如果繼承了某個抽象類或者實現了某個介面都需要對其中的抽象方法全部進行實現,否則該類仍然需要被宣告為抽象類。介面比抽象類更加抽象,因為抽象類中可以定義構造器,可以有抽象方法和具體方法,而介面中不能定義構造器而且其中的方法全部都是抽象方

Java_49_介面interface

普通類:只有具體實現 抽象類:具體實現和規範(抽象方法)都有 介面:只有規範 為什麼需要介面?介面和抽象類的區別? 介面就是比“抽象類”還“抽象”的“抽象類”,可以更加規範的對子類進行約束。 全面的專業的實現了:規範和具體實現的分離。 抽象類還提供某些具體實現,介面不提供

重走Java基礎:面向物件-介面interface

介面 1. 介面概念 介面是功能的集合,同樣可看做是一種資料型別,是比抽象類更為抽象的”類”。 介面只描述所應該具備的方法,並沒有具體實現,具體的實現由介面的實現類(相當於介面的子類)來完成。這樣將功能的定義與實現分離,優化了程式設計。 請記住:一切事物均有功能,即一切事物均

深入理解java中的介面 Interface

概念 我們知道java中是單繼承的,這就有了很多的限制,比如我們需要多繼承的時候但是不能用多繼承,這時候怎麼辦呢?就引入了介面的概念,它彌補了java中單繼承的缺陷,這一點非常的好,如果要約定子類的實現要求並避免單繼承侷限就需要使用介面。 那麼什麼是介面呢?

第10章 介面Interface

介面的概述 是一個由外部 給類選擇性的新增行為的新的資料型別 編寫、實現、繼承介面的語法 在定義常量時: 可以寫成 public static final 也可以寫成 static final 亦可以寫成 final 甚至可以直接去掉

java基礎抽象類abstract class介面Interface

抽象類(abstract class)和介面(Interface)是Java語言中對於抽象類定義進行支援的兩種機制,賦予了Java強大的面向物件能力。 二者具有很大的相似性,甚至可以相互替換,因此很多開發者在進行抽象類定義時對於abstractclass和Interface的選擇顯得比較

php介面interface跟抽象類abstract的作用與好處

假設現在有六個類 動物(Animal)抽象類 老虎(tiger) 繼承動物類 蛇類(snake) 繼承動物類 兔子(rabbit) 繼承動物類 農夫(farmer)農夫可以餵養Animal 貼程式碼跟解釋 abstract class Animal{ //定

Java學習-介面interface

文章目錄 一、基本含義 一、基本含義 定義語法:訪問控制修飾符 非訪問控制修飾符 interface 介面名 extends 父介面1,父介面2…{ 常量屬性; 抽象方法;} 專案 含義

golang學習-------------認識golang的介面interface

golang從設計之初本不是一個面向物件的語言,但是為了更高效的開發,又提供了一些面向物件的能力,golang的面象物件主要就是通過interface來實現的,今天我們就來聊一聊golang的這個interface。 首先呢先聊點形式化的東西,golang的interfac

TypeScript學習筆記之 介面Interface

在java中,介面是用來定義一些規範,使用這些介面,就必須實現介面中的方法,而且介面中的屬性必須是常量。 javascript中是沒有介面的概念的。所以TypeScript在編譯成 JavaScrip

單點登入SSO實現方式附原始碼

原文地址:http://www.cnblogs.com/youring2/p/sso-practice.html SSO的基本概念 SSO英文全稱Single Sign On(單點登入)。SSO是在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統

TypeScript系列學習筆記-介面interface

介面簡介:原則:對值所具有的結構進行型別檢查(核心原則之一)。 它有時被稱做“鴨式辨型法”或“結構性子型別化;作用:為這些型別命名和為你的程式碼或第三方程式碼定義契約。語法:宣告關鍵字,interface ,程式碼例項如下:宣告一個介面 IPerson,定義屬性欄位:name

ts核心基礎之介面Interface

作為一個純粹的前端攻城獅,有時候很難理解面向物件的思維,所以,有些功能你能夠用JS完成,但是轉換成TS就有點不知所措了。面向物件設計和程式設計遵循的幾個原則: SOLID原則:SRP(Single Responsibility Principle) 單一職責原則;OCP(Op

java之介面interface和抽象abstract關鍵字詳解

1.抽象類: abstract class kabstract { public abstract void say(); public abstract void run(); }(1)抽象類必須用abstract【抽象的,】關鍵字修飾 (2)抽象方法是

抽象類abstract class介面interface有什麼異同?【Java面試題】

1、抽象類可以包含非抽象的方法,而介面中的方法必須是抽象的。 2、繼承抽象類在Java語言體系中體現一種繼承關係,在合理的繼承關係中,父類和派生類比如按存在is-a關係。而實現介面則體現一種has-a

抽象類abstract class介面Interface的區別

前言 抽象類(abstract class)和介面(Interface)是Java語言中對於抽象類定義進行支援的兩種機制,賦予了Java強大的面向物件能力。二者具有很大的相似性,甚至可以相互替換,因此很多開發者在進行抽象類定義時對於abstractclass和Interfa