码迷,mamicode.com
首页 > 其他好文 > 详细

Ruby-类

时间:2016-05-18 22:11:10      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:initialize   attr_   public   private   protected; public   

#类与对象
class Person
  def initialize(name,age,sex)      #initialize 方法,试用new方法生成新的对象时,该方法会被调用,同时new方法的参数会原封不动的传给该方法,因此初始化对象时需要的处理一般都写在这个方法中
    @name = name    #初始化实例变量
    @age = age
    @sex = sex
  end
#  attr_accessor :name,:age,:sex        #设置变量的方法:attr_reader为可读,attr_writer为可写,attr_accessor为可读写
  attr_accessor :age #将age属性标记为可读写
  def info                             #实例方法
    puts "my name is #{@name},I‘m #{@age},sex is #{@sex} "
  end
end
leijun = Person.new("BuSi Lei",20,"male")   #创建一个对象并初始化其属性
leijun.info
leijun.age = 50   #对leijun的age属性赋值
p leijun.age
p leijun.class


#父类与子类
class Person
  @@dna = "--~~~----~~~---"     #在父类中创建一个类变量@@dna
end


class Phone < Person      #创建一个子类Phone 继承 Person类的一部分属性
end
xiaomi = Phone.new("xiaomi4",3,"other")
xiaomi.info
xiaomi.age = 4
p xiaomi.age


class Phone
  @@dna = "FF-F0"               #在子类Phone中修改类变量@@dna,也会使父类中的同名类变量发生改变
  def info                      #为子类定义一个输出类变量属性的实例方法,与父类Person 中的实例方法同名,只会覆盖本身继承过来的方法,不会影响到父类
    puts "dna ? - #{@@dna}"
  end
end

class Person
  def sup
    puts "#{@@dna}"
  end
end

xiaomi.info
leijun.info         #输出无变化
leijun.sup          #@@dna的输出值被改变


#类实例变量     (类也是对象,一切皆为对象),不会被继承
class Person
  @race = "yello"
  def race
    puts "race is #{@race}"
  end
end
leijun.race               #输的结果可看出,在一个类中,一个实例变量不能访问类实例变量
xiaomi.race

#类方法
class Person
  @race = "yello"
  def self.race           #定义类方法,形如 def self.xxxxxx,来调用类的实例变量
    puts "race is #{@race}"
  end
end
Person.race               #直接使用类名.类方法名来调用类方法


#class Person            #定义类方法的第二种方法
#  class << self
#    def test
#      puts "class method"
#    end
#  end
#end

class Person
  def self.race=(race)  #定义一个形如self.xxx=(xxx)的方法,来修改类变量的属性
    @race = race
  end
end
Person.race = "Black" #修改属性
Person.race
Phone.race              #子类不能继承父类的类实例变量

class Phone
  @race = "Red"         #为子类创建一个类实例变量
end
Phone.race            #可以继承类方法,但不能继承类实例变量,通过子类自己创建的类实例变量,可以调用继承过来的类方法来输出结果



#限定方法访问的作用域   public,private,protected; public为默认模式
class Person
  private           #定于test方法的作用域; private 与 protected,都不能在外部访问test方法
  def test
    puts "Hello Thank you"
  end
end
#leijun.test       #结果报错,在对象外部不能调用私有的实例方法

class Person
  def test2       #定义一个test2方法调用内部test方法
    test
  end
  protected         #设置为private或者protected 都能test2方法调用
    def test
    puts "Hello Thank you"
  end
end
leijun.test2
xiaomi.test2
leijun.send(:test)     #通过send方法能直接调用类的私有方法

class Animal
   def antest
     haha = Person.new("haha",20,"male")
     haha.test2                            #给定一个外部方法访问的接口,通过这个方法访问其他类中的私有实例方法,private或者protected 都可以
   end
end
Animal.new.antest


本文出自 “邀月乘风” 博客,请务必保留此出处http://yaoyuechengfeng.blog.51cto.com/2958475/1774807

Ruby-类

标签:initialize   attr_   public   private   protected; public   

原文地址:http://yaoyuechengfeng.blog.51cto.com/2958475/1774807

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!