Chapter 16_2 继承

  类也是对象,所有它们也可以从其他类获得方法。这就是“继承”,可以在Lua中表示:

Account = { balance = 0}
function Account:new(o)
    o = o or {}
    setmetatable(o , self)
    self.__index = self
    return o
end
function Account:deposit(v)
    self.balance = self.balance + v
end
function Account:withdraw( v)
    if v> self.balance then error "infufficient funds" end
    self.balance = self.balance - v
end

如果想从这个类中派生一个子类,以使客户能够透支。则先需要创建一个空的类,从基类继承所有的操作:

SpecialAccount = Account:new()

SpecialAccount就是一个Account的实例。如下所示:

s  = SpecialAccount:new(limit = 1000.00)

SpecialAccount从Account继承了new方法。它的self参数表示为SpecialAccount。当执行:

s:deposit(100.00)

Lua在s中不能找到deposit字段,就会查找SpecialAccount,如果还找不到,就查找Account。最终会在那里找到deposit的原始实现。

SpecialAccount之所以特别,是因为可以重定义那些从基类继承的方法。编写一个方法的新实现只需:

function SpecialAccount:withdraw(v)
    if v - self.balance >= self:getLimit() then
        error "insufficient funds"
    end
    self.balance = self.balance - v
end
function SpecialAccount:getLimit()
    return self.limit or 0
end

现在,当调用s:withdraw(200.00)时,Lua就不会在Account中找了,因为它有了。由于s.limit为1000.00,程序会执行取款,并使s变成一个负的余额。

  Lua中的对象有一个特殊现象,就是无须为指定一种新行为而创建一个新类。如果只有一个对象需要某种特殊的行为,那么可以直接在该对象中实现这个行为。

例如账户s表示一个特殊客户,这个客户的透支额度是其余额的10%,那么可以只修改这个对象:

function s:getLimit()
    return self.balance * 0.10
end

调用s:withdraw(200.00)还是会执行SpecialAccount的withdraw。但withdraw调用的self:getLimit则是上面的这个定义。

以上内容来自:《Lua程序设计第二版》和《Programming in Lua  third edition 》

时间: 2024-08-05 21:46:58

Chapter 16_2 继承的相关文章

Head first java chapter 7 继承与多态

《Java学习笔记JDK8》学习总结

chapter 6   继承与多态 6.1何谓继承 1.继承的定义:继承就是避免多个类间重复定义共同行为. 2.总结:教材中通过设计一款RPG游戏的部分代码向我们展示了“重复”程序代码的弊端,为了改进,我们引进了继承的概念.在我们自我学习的过程中,通过一次次的改进,也曾经得到这样的启示:在不同的信息类中,有多少的属性就设置多少个变量,给每个属性分别给予设置和获取的方法,以来可以将属性设为private时仍然可以存取引用数据,二来当多个类拥有同样属性和同样的设置.获取方法时,我们可以将其利用继承于

Chapter 17. Objects and Inheritance(对象与继承)

SELECT DISTINCT fa.application_short_name 模块,                 b.responsibility_name 职责名称, fa.application_name 应用产品,                 b.responsibility_key 责任关键字, b.description 说明,                 DECODE (b.data_group_id, 0, '标准', '') 数据组,              

Chapter 7、面向对象(三)--- 静态、方法重载、继承

重载: 1 package org.hanqi.pn0120; 2 3 public class Jisuanqi { 4 5 //整型加法 6 public int add(int a,int b) 7 { 8 return a+b; 9 } 10 //重载 参数个数不同 11 public double add(int c, int d,int e) 12 { 13 return c+d+e; 14 } 15 16 17 //浮点型加法 方法的重载(多态的一种体现) 18 //参数类型不同

Chapter 8. 面向对象(继承)

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 继承 { public class Person { //字段 private string _name; private int _age; private char _gender; //属性 public string Name { get { return _name; } set { _name

(WPF)属性值继承

属性值继承并不同于传统面向对象的类继承,而是指属性值自顶向下沿着元素树传递. 下面的代码在Window 元素上设置了Font属性.两个设置将会沿着逻辑树向下传递,并由子元素继承. 但是若子元素如设置了这样的属性,则不受其父元素设置的影响. <span style="font-size:14px;"> </span><span style="font-size:12px;"><Window xmlns = "http

Qt5官方demo解析集15——Chapter 1: Creating a New Type

本系列所有文章可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 前面我们说到了QML的粒子系统,它可以创造丰富多彩的粒子特效.但是更多的情况下,我们的QML界面是配合C++进行工作的:QML负责界面渲染,C++负责逻辑事务.甚至有时,我们还会利用QML来绘制C++代码中定义的可视化组件,或者使用C++代码来访问QML中对象的属性等.从这篇博文开始,我们介绍了Qt官方Demo中的"Chapter"系列,它介

EFFECTIVE OBJECTIVE-C 2.0 TIPS 总结 CHAPTER 1 &amp; CHAPTER 2

下面只是对读到的所有 Tips 结合我平时开发中遇到的问题进行总结,每一个 Tips 和书中的每一条对应,本文的目的是去掉书中的大部分讨论的内容,让人能够马上使用这些 Tips,建议阅读过原书后食用更佳. CHAPTER 1 熟悉 OBJECTIVE-C Tips 1 Objective-C 的起源 Objective-C 是从 C 语言演化而来,有 C 的一些基础会有很大帮助 Tips 2 头文件中减少引用 减少在类的头文件中 import 其他头文件,如果使用其他类,那么使用@class C

Qt5官方demo解析集18——Chapter 4: Using Custom Property Types

本系列所有文章可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集17--Chapter 3: Adding Property Bindings 在前面的"饼状图"Demo中,我们为这个自定义类型定义了"name"和"color"属性,他们都是基于Qt内置类型"QString"和"QColor",这