(六)类

(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

  def initialize(name,no,gender)
    @name=name
    @no=no
    @gender=gender
  end

  def sayHi
    puts "我叫#{@name},学号是#{@no}"
  end

  def 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

  def 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

 

posted @ 2016-01-27 17:59  SixEvilDragon  阅读(174)  评论(0编辑  收藏  举报