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