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
- Ruby中通过class className … end定义类。
- 类的实例变量采用@操作符定义,类变量采用@@操作符定义。
- attr_reader设置可读变量,类似C#中的get方法,attr_writer设置可写变量,类似C#中的set方法;attr_accessor设置变量的可读写。
- initialize默认为类的构造函数。定义类之后,可以使用new方法来创建实例,实际上new是类的方法,其功能是创建新对象,并以传入的参数调用initialize初始化对象。
def self.new(*args)
o = self.allocate
o.send(:initialize, args)
o
end
- 类中不允许方法重载,同名的方法后一个将会覆盖前一个方法定义。
- 可以使用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
- Ruby中使用<表示类的继承关系,且只能单一继承。
- 类中private、protected、public方法限定了类方法的访问权限。