ruby的OOP学习

ruby的所有类都继承自object,而object又继承自BasicObject(此类为ruby1.9新增)

类的定义

定义类使用关键字class,定义方法使用def,

例子:

class MyClass
  #定义类方法
  def self.method1
    puts "类方法mothod1"
  end
  #另一种方式定义类方法
  def MyClass.method2
    puts "另一种定义的类方法method2"
  end
  #定义实例方法
  def method3
    puts "实例方法method3"
  end
end
myclass = MyClass.new
MyClass.method1
MyClass.method
myclass.method

  类方法相当于java中的静态方法,无须实例化可直接调用.但不能被实例化后的对象调用

定义属性又4个方法,attr,attr_reader,attr_writer,attr_accessor,他们的作用分别是只读或或可读属性,只读属性,只写属性,可读写属性,他们属于Module类的方法.

例子:

class MyClass
  attr_accessor :attr1
  def attr2
    @attr2
  end

  def set_attr2(value)
    @attr2 = value
  end
end

myclass = MyClass.new
myclass.attr1="attr1"
puts myclass.attr1

myclass.set_attr2("attr2")
puts myclass.attr2

 访问控制

ruby提供三个关键字,public,protected,private.其中ruby默认的级别是public即没有任何限制.

protected级别的方法只能被该类自身和其子类的对象 所调用

private级别的方法只能被self调用,换句话来说就是只能被其自身和子类自身的方法的调用.
例子:

class MyClass
  #默认是public
  def public_method
    puts "public_method"
  end
  #定义protected方法
  protected
  def protected_method
    puts "protected_method"
  end
  #定义private方法
  private
  def private_method
    puts "private_method"
  end
end

class MySubClass<MyClass
  #调用父类中的protected方法
  def call_protected_method
    protected_method
  end
  #调用父类的private方法
  def call_private_method
    private_method
  end
end

my_sub_class = MySubClass.new
my_sub_class.call_protected_method
my_sub_class.call_private_meth

 

类的扩展和继承

通过代码

puts 1.class.name

 可知

1是Fixnum的一个实例,下面就对Fixnum进行扩展

class Fixnum
  def speak
    puts "我的值是#{self}"
  end
  def abs
    puts "abs不能用了"
  end
end
#扩展类方法
def Fixnum.say_hello
  puts "Hello!"
end

1.speak
-1.abs
Fixnum.say_hello

 输出

我的值是1

abs不能用了

Hello!

 

self和super

ruby中的self用来引用自身,和java中的this功能相似.super关键字则用来引用父类的相同方法

例子:

class Person
  attr_accessor :name,:age
  def say_hello
    puts "你好,我是#{self.name}"
  end
  def say_age
    puts "我的年龄是#{self.age}"
  end
end
class Man<Person
  def sex
    "男"
  end
  def say_sex
    puts "我的性别是#{self.sex}"
  end
  def say_hello
    super
    say_age
    say_sex
  end
end
man = Man.new
man.age=20
man.name="jone"
man.say_hello

 输出:

你好,我是jone

我的年龄是20

我的性别是男

 

ruby的构造方法initialize和给对象创建属于对象的方法

class Man
  attr_accessor :myname,:myage
  #类的构造方法
  def initialize(name,age)
    @myname = name
    @myage = age
  end
end
@myname = "test"
@myage = 10
me = Man.new("jack", 30)
#为对象定义方法
def me.about_me
  puts "我叫#{self.myname},年龄是#{self.myage}"
end
me.about_me

 

最后再说下ruby的==和equal?

对于数值形来说这两个貌似没什么区别

对于字符串来说

==比较的是字符串是否相同

equal?比较的是是否是同一个字符此

如:

a="123"

b="123"

a==b 返回true

a.equal? b 返回false

你可能感兴趣的:(oop,Ruby)