Ruby基础知识-6.类和对象

一、类定义

class Account

  attr_accessor :number

  @@count = 0 

  def initialize(number, name, balance)

    @number = number

    @name = name

    @balance = balance

    @@count = @@count + 1;

  end 

  def Account.count

    @@count

  end 

  def Account.count=(value)

    @@count = value

  end 

  def name

    @name

  end 

  def name=(value)

    @name = value

  end 

  def balance

    @balance

  end 

  def deposit(money)

    if money <= 0

      raise  ArgumentError, "必须是正数"

    end

    @balance += money

  end 

  def withdraw(money)

    if money > @balance

      raise  RuntimeError, "余额不足"

    end

    @balance -= money

  end 

  def ==(that)

    self.name == that.name && self.balance == that.balance && self.number == that.number

  end

end

acct = Account.new("123", "swzhou", 0)

puts acct.number

puts acct.name

puts Account.count

acct = Account.new("456", "zsw", 0)

puts Account.count

  1. Ruby中通过class className … end定义类。
  2. 类的实例变量采用@操作符定义,类变量采用@@操作符定义。
  3. attr_reader设置可读变量,类似C#中的get方法,attr_writer设置可写变量,类似C#中的set方法;attr_accessor设置变量的可读写。
  4. initialize默认为类的构造函数。定义类之后,可以使用new方法来创建实例,实际上new是类的方法,其功能是创建新对象,并以传入的参数调用initialize初始化对象。

def self.new(*args)

o = self.allocate

o.send(:initialize, args)

o

end

  1. 类中不允许方法重载,同名的方法后一个将会覆盖前一个方法定义。
  2. 可以使用instance_of?方法测试对象是否为某个类的实例,可以使用is_a?或===方法判定是否为某个继承体系的实例。

二、类继承

class CheckingAccount < Account

  attr_reader :id, :name, :balance

  def initialize(id, name)

    @id = id

    @name = name

    @balance = 0

    @overdraftlimit = 30000

  end

  def withdraw(amt)

    if amt <= @balance + @overdraftlimit

    @balance -= amt

    else

      raise RuntimeError, "超出信用额度"

    end

  end

  def to_s

    super + "Over limit\t#{@overdraftlimit}         "#super呼叫父类别to_s方法

  end

end

acct = CheckingAccount.new(" E1223", "Justin Lin")

puts acct.to_s

  1. Ruby中使用<表示类的继承关系,且只能单一继承。
  2. 类中private、protected、public方法限定了类方法的访问权限。
posted @ 2013-05-29 22:25  swzhou  阅读(216)  评论(0编辑  收藏  举报