1.类
1.1类声明
class 类名
#类体
end
类声明是 Class
类的实例,类名就是存储这个实例的常量,因此在赋值后不可以通过重新赋值更改其值。
2.成员
2.1访问器属性
注意:Ruby 语言不支持类访问器属性。
#手动方式
class ClassWithGetSet
def initialize(x, y)
@x, @y = x, y
end
#实例getter
def x
@x
end
#实例getter
def y
@y
end
#实例setter
def x=(value)
@x = value
end
#实例setter
def y=(value)
@y = value
end
end
#自动方式
class ClassWithGetSet
#getter
#注意:attr()是attr_reader()的简写。
attr_reader(:x, :y)
attr(:x, :y)
#setter
attr_writer(:x, :y)
#getter和setter
attr_accessor(:x, :y)
end
2.2构造方法
一个类非必须有构造方法。如果一个类没有构造方法,相当于定义了一个方法体为空的构造方法。如果一个类有多个构造方法,后定义的构造方法会覆盖先定义的构造方法。
class 类名
def initialize()
#构造方法体
end
end
3.对象
3.1创建对象
#无实参
对象名 = 类名.new()
#有实参
对象名 = 类名.new(实参)
3.2方法重载(Overload)
Ruby 语言不支持方法重载。
3.3self关键字
如果在类上下文,则 self
关键字指向当前类。
如果在对象上下文,则 self
关键字指向当前对象。
4.访问成员
类名::类常量名
类名.类方法名()
对象名.实例访问器属性名
对象名.实例方法名()
5.继承
一个子类只可以直接继承自一个父类,不可以直接继承自多个父类。
子类会直接继承父类中可继承的成员,间接继承祖父类中可继承的成员,以此类推,直至没有可继承的成员。
支持的成员:类常量、类方法、实例访问器属性、实例方法、构造方法,不支持类变量、类实例变量、实例变量。
注意:从父类中继承过来的成员无需在子类中重新声明,否则会发生覆盖。
class 子类名 < 父类名
#子类体
end
5.1覆盖(Override)
如果从父类中继承过来的成员在子类中重新声明,此时相当于在子类中同时声明了两个相同名称的成员,则在子类中重新声明的成员会覆盖从父类中继承过来的成员。
注意:只需要成员名称相同,就会发生覆盖。
注意:关于支持覆盖的成员,参考继承章节。
注意:覆盖并不会影响父类中原来的成员。
class A
def f()
1
end
end
class B < A
def f()
2
end
end
puts B.new().f() # 2
5.2super()方法
super()
方法用于在子类中调用父类的同名成员。
支持的成员:类方法、实例访问器属性、实例方法、构造方法。
#传递所有实参
super
#不传递实参
super()
#传递所有或部分实参
super(实参)
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/ruby/rubylang/36160.html