(六)类
(1)讲类之前,先讲讲自定义方法
自定义方法并调用
def test
puts "hello"
end
test
def test(a,b)
return a+b
end
puts test(3,4)
puts test 5,6 #ruby方法的括号加不加都可以
c=test 4,5
puts c
(2)类变量
Ruby支持双引号去创建一个类,但是一般创建类是通过new关键字
new的形式就是构造方法,每个类都有它自己的构造方法
定义方法的关键字是def(定义构造方法不是new,使用构造方法才是new),定义类关键字是小写class
类变量是@
puts "hello world".class
puts String.class #.class用于查看父类,String的父类是Class
a=String.new("hello world")
puts a
b=a+"!!!"
puts b
class Student
def initialize(name,no,gender)
@name=name
@no=no
@gender=gender
end
def sayHi
puts "我叫#{@name},学号是#{@NO}" #解析变量,大小写错误,执行不报错但是不输出结果
end
end
a=Student.new("张三",23,"男")
a.sayHi
Ruby区分大小写,NO,No都无法输出
修改为puts "我叫#{@name},学号是#{@no}"
Ruby方法名中可以包含运算符号比如"="
class Student
def initialize(name,no,gender)
@name=name
@no=no
@gender=gender
end
#setter
def name=(name)
@name=name
end
#getter
def name
return @name
end
def sayHi
puts "我叫#{@name},学号是#{@no}"
end
end
a=Student.new("张三",23,"男")
a.sayHi
a.name ="李四" #调用时name= 与name =都一样
a.sayHi
如上get,set的写法太麻烦,ruby是高雅的语言,有简单的写法
attr_accessor :name就包含name属性的get和set,一般放在类的最前面
只要冒号前留个空格即可,这样就可读可写
只可读attr_reader :no
只可写attr_writer :gender
class Student
attr_accessor :name
attr_reader :no
attr_writer :gender
def initialize(name,no,gender)
@name=name
@no=no
@gender=gender
end
def sayHi
puts "我叫#{@name},学号是#{@no}"
end
end
a=Student.new("张三",23,"男")
a.sayHi
puts a.gender
a.gender ="女"
puts a.gender
a.no=3
puts a.gender
(3)类常量
Ruby一般规定常量的首字母大写
如上类变量在该类里面的方法可以访问,也就是说类变量在该类里的作用域是全局的。那我们如何访问类常量?
类常量用::来访问,且类常量不可修改
class Student
Version="1.0.0"
attr_accessor :name
attr_reader :no
attr_writer :gender
def initialize(name,no,gender)
@name=name
@no=no
@gender=gender
end
def sayHi
puts "我叫#{@name},学号是#{@no}"
end
end
a=Student.new("张三",23,"男")
puts a::Version
(4)类的方法访问控制
让别人可以访问调用的,方法前面什么都不写(默认public),也可以写上public
class Student
Version="1.0.0"
attr_accessor :name
attr_reader :no
attr_writer :gender
def initialize(name,no,gender)
@name=name
@no=no
@gender=gender
end
#public def sayHi也可以
#public() def sayHi不可以
#public() 带括号则需要分两行才可以
#def sayHi
def sayHi
puts "我叫#{@name},学号是#{@no}"
end
end
a=Student.new("张三",23,"男")
a.sayHi
(4)类方法、实例方法
类方法关键字是self,类方法只能通过类名去访问,因为类方法默认都是private的。类方法不能通过实例去访问,前面我们讲的那些都是实例方法所以都通过实例去访问。
class Student
Version="1.0.0"
attr_accessor :name
attr_reader :no
attr_writer :gender
def initialize(name,no,gender)
@name=name
@no=no
@gender=gender
end
def sayHi
puts "我叫#{@name},学号是#{@no}"
end
def self.test
return "小名"
end
end
a=Student.new("张三",23,"男")
a.sayHi
puts Student.test
puts a.test
(5)类的继承
继承符号<
继承不仅继承实例方法,还继承类方法
class Student
Version="1.0.0"
attr_accessor :name
attr_reader :no
attr_writer :gender
d
ef initialize(name,no,gender)
@name=name
@no=no
@gender=gender
end
def sayHi
puts "我叫#{@name},学号是#{@no}"
end
d
ef self.test
return "小名"
end
end
class UniversityStudent<Student
def say_english
p "my english is poor"
end
end
a=UniversityStudent.new("张三",23,"男")
a.sayHi
p "UniversityStudent.test"
p UniversityStudent.test
puts UniversityStudent.test
a.say_english
覆盖原来方法,只要重新写一遍即可
class Student
Version="1.0.0"
attr_accessor :name
attr_reader :no
attr_writer :gender
def initialize(name,no,gender)
@name=name
@no=no
@gender=gender
end
d
ef sayHi
puts "我叫#{@name},学号是#{@no}"
end
def self.test
return "小名"
end
end
class UniversityStudent<Student
def say_english
p "my english is poor"
end
def sayHi
puts "新名字叫#{@name}" end
end
end
a=UniversityStudent.new("张三",23,"男")
a.sayHi
p "UniversityStudent.test"
p UniversityStudent.test
puts UniversityStudent.test
a.say_english