LUA物件導向程式設計(三)多型

2021-06-22 23:17:25 字數 2457 閱讀 5521

先來了解一下多型的概念。在物件導向語言中,多型本質就是執行時繫結,比如有乙個父類baseclass,它有2個子類subclass1,subclass2。baseclass有乙個方法func(),兩個子類都重寫了這個方法。那麼我們可以定義乙個baseclass的引用obj,讓它指向乙個子類的物件,比如baseclass obj = new subclass1();那麼我們呼叫obj.func()方法時候,會進行動態繫結,也就是obj它的實際型別的func()方法,即subclass1的func()方法。同樣baseclass obj = new subclass2();obj.func()其實呼叫的是subclass2的func()方法。這種由於子類重寫父類方法,然後用父類引用指向子類物件,呼叫方法時候會進行動態繫結,這就是多型。

但是,在lua中沒有型別的概念,不存在像c++中那樣用基類的引用或指標來指向派生類,因此,在lua中模擬的多型只能說是:基類生成的物件會呼叫基類的方法,如果它的子類重寫了該方法,那麼子類生成的物件就會呼叫子類的這個方法,而不會去呼叫基類中的方法。

我們還是以《lua物件導向程式設計(二)繼承》

中的例子來進行說明:

localvehicle=

vehicle.__index = vehicle

function vehicle:new(wheels, speed, color)

local obj = {}

setmetatable(obj, self)

obj.wheels = wheels

obj.speed = speed

obj.color = color

return obj

end

function vehicle:getspeed()

print(self.speed)

end

function vehicle:setspeed(x)

self.speed = x

end

--新增了新的函式介面

function vehicle:getpluss()

return 50

end

function vehicle:speedpluss()

--在這裡呼叫getpluss介面,如果是基類物件,就呼叫基類的方法,如果是子類例項,就呼叫子類的方法

self.speed =self:getpluss()+ 1

end

localbicycle=

setmetatable(bicycle, vehicle)--這裡就實現了bicycle對vehicle的繼承

bicycle.__index = bicycle --這樣就實現了乙個類,以便bicycle的每個例項都到bicycle進行查詢

function bicycle:new(engine)

local obj = {}

obj = vehicle:new(2, 10, "r")

obj.engine = engine --除了繼承基類成員外,新增自己成員

setmetatable(obj, self) --使得bicycle的每個例項都與bicycle掛鉤

return obj

end

function bicycle:setspeed(s)

self.speed = s

end

function bicycle:getspeed()

print(self.speed)

end

--在這裡重定義了基類的getpluss

function bicycle:getpluss()

return 10

end

function bicycle:printall()

print(self.speed .. "," .. self.wheels ..",".. self.color .. "," .. self.engine)

end

--分別定義乙個基類物件和子類物件

b = vehicle:new() --use default value

s = bicycle:new(3)

b:getspeed()

s:getspeed()

b:speedpluss()

s:speedpluss()

b:getspeed()

s:getspeed()

輸出結果:

100 10

51 11

從中我們可以看到,在呼叫speedpluss方法時,基類物件b和子類物件s分別呼叫了自己的方法getpluss,基類的方法返回的結果是50,因此最終結果是51,子類方法返回的是10,因此最終的結果是11。這就是lua中的多型性。

(全文完)

物件導向(三) 多型

多型是物件導向三大特性中比較難理解的乙個概念,但並不複雜!在這裡介紹下有關多型的概念以及相關用法。多型可以理解為對於同乙個方法,根據不同的物件產生不同的結果。光說肯定很抽象,下面用個例子去解釋多型。例子 package com.zzl.polymorphism public class polymo...

C 物件導向(三)多型

物件的多種形態 辛巴是獅子 辛巴是動物。animal xinba new lion 行為的多種形態 同樣的行為,但是表現形式不同。也就是說方法簽名一樣,方法體不同。簽名在這裡指的是方法名 引數以及返回值 行為的多型體現為方法的重寫 隱藏 過載 隱藏是實現多型的基本方法之一。class program...

Python物件導向的特點(三)多型

在物件導向程式設計中,不同的子類物件呼叫相同的父類方法,產生不同的執行結果 示例 需求 定義狗類和人類,要求普通的狗類開心的玩耍,特殊的狗類和公尺老鼠玩耍。class dog object def init self,name self.name name def game self print s...