Latest web development tutorials

루비 객체 지향

루비 순수 객체 지향 언어, 루비, 모든 물체의 형태이다. 문자열, 숫자, 심지어 true 및 false입니다 개체 : 루비의 각 값은 객체, 심지어는 가장 원시적 인 것입니다. 클래스 자체는클래스 클래스의인스턴스 인목적이다.이 장에서는 루비 객체 지향과 관련된 모든 주요 기능을 설명 알려줍니다.

클래스 깔끔한 패키지로 데이터를 구성하는 데이터의 표현 방법을 결합하여 지정된 오브젝트를 형성하는 데 사용된다. 클래스 데이터 및 방법은 클래스의 멤버라고합니다.

루비 클래스 정의

당신이 클래스를 정의 할 때, 당신은 실제로 데이터 유형에 대한 청사진을 정의합니다. 이것은 실제로 데이터를 정의하지 않고, 클래스 수단의 이름, 즉 무엇인지에 대한 정의는, 클래스의 오브젝트를 구성하는 것의 정의 될 것이며, 어떤 작업은 개체에 대해 수행 될 수있다.

클래스 정의클래스 이름 다음 키워드 클래스로시작하고, 마지막으로 이러한 정의를 축소 분리 된 표현으로끝난다.예를 들어, 우리는 다음과 같이 Box 클래스를 정의하는 클래스의 키워드를 사용

class Box
   code
end

관례 적으로, 이름은 둘 이상의 단어가 포함되어있는 경우, 대문자로 시작하는 각 단어의 첫 글자를 대문자로, 그러나 여기에서 (예 : CamelCase를) 더 구분은 없어야합니다.

루비 개체 정의

클래스 그래서 기본적으로 개체 클래스에 따라 생성되는 개체에 대한 청사진을 제공합니다. 우리는 클래스 객체를 선언 할새로운 키워드를 사용합니다.다음 문은 클래스 상자 두 개체를 선언합니다 :

box1 = Box.new
box2 = Box.new

방법을 초기화

초기화 방법은 표준 루비 클래스있어서 다른 객체 지향 프로그래밍 언어 생성자 작동동일한 클래스의 생성자이다. 동시에 객체를 생성하는 클래스의 몇 가지 변수를 초기화 할 때, 방법은 유용 초기화합니다. 다음에있어서,그것이 DEF 키워드 앞에 배치해야이 방법을 사용하여, 다른 방식 루비 같은 일련의 인수를 취

class Box
   def initialize(w,h)
      @width, @height = w, h
   end
end

인스턴스 변수

부동산의 클래스인스턴스 변수는 객체의 재산이됩니다 클래스 객체를 사용할 때 자신이 만든 것입니다.각 개체의 개별 속성은 다른 개체들, 할당하고, 가치를 공유하지 않습니다. 클래스가 클래스 외부 그 속성에 액세스 @ 연산자를 사용하는 것 내에서, 방법을 액세스라는접근 방법을 사용하는것이일반적이다.여기에서 우리는 인스턴스 변수로 예를 들어, 클래스 상자 @width 및 @height 위의 클래스상자를 정의합니다.

class Box
   def initialize(w,h)
      # 给实例变量赋值
      @width, @height = w, h
   end
end

접근 자 (접근) 세터 (세터) 방법

클래스의 외부 변수를 사용하기 위해, 우리는 내부액세스 방법에서이들 변수를정의하며,접근하는 해당게터이다.다음 예는 접근 방법을 보여줍니다

#!/usr/bin/ruby -w

# 定义类
class Box
   # 构造函数
   def initialize(w,h)
      @width, @height = w, h
   end

   # 访问器方法
   def printWidth
      @width
   end

   def printHeight
      @height
   end
end

# 创建对象
box = Box.new(10, 20)

# 使用访问器方法
x = box.printWidth()
y = box.printHeight()

puts "Width of the box is : #{x}"
puts "Height of the box is : #{y}"

상기 코드가 실행되는 경우, 다음과 같은 결과를 생성 할 것이다 :

Width of the box is : 10
Height of the box is : 20

변수 값에 액세스하는 데 사용되는 액세스 방법과 유사하게, 루비 클래스 A의 외부 변수 값은 다음과 같이또한 세터 방법이라고 정의를 설정하는 방법을 제공한다 :

#!/usr/bin/ruby -w

# 定义类
class Box
   # 构造器方法
   def initialize(w,h)
      @width, @height = w, h
   end

   # 访问器方法
   def getWidth
      @width
   end
   def getHeight
      @height
   end

   # 设置器方法
   def setWidth=(value)
      @width = value
   end
   def setHeight=(value)
      @height = value
   end
end

# 创建对象
box = Box.new(10, 20)

# 使用设置器方法
box.setWidth = 30
box.setHeight = 50

# 使用访问器方法
x = box.getWidth()
y = box.getHeight()

puts "Width of the box is : #{x}"
puts "Height of the box is : #{y}"

상기 코드가 실행되는 경우, 다음과 같은 결과를 생성 할 것이다 :

Width of the box is : 30
Height of the box is : 50

인스턴스 메소드

그들은DEF 키워드를 이용하고, 인스턴스 메소드정의 된 다른 방법을 정의하지만, 이하의 실시 예에 도시 된 바와 같이, 그들은 단지 클래스 인스턴스에 의해 사용될 수있다. 이들 함수는 인스턴스 변수에 접근 제한뿐만 아니라, 더 많은 다른 작업을 수행 할 필요에 따라되지 않습니다.

#!/usr/bin/ruby -w

# 定义类
class Box
   # 构造方法
   def initialize(w,h)
      @width, @height = w, h
   end
   # 实例方法
   def getArea
      @width * @height
   end
end

# 创建对象
box = Box.new(10, 20)

# 调用实例方法
a = box.getArea()
puts "Area of the box is : #{a}"

상기 코드가 실행되는 경우, 다음과 같은 결과를 생성 할 것이다 :

Area of the box is : 200

클래스 변수 클래스 메서드 &

클래스 변수는 클래스 공유 변수의 모든 인스턴스입니다.즉, 클래스 인스턴스 변수는 모든 오브젝트의 인스턴스를 액세스 할 수있다. 다음의 예와 같이 문자 (@@) 접두사로, 클래스 변수, 클래스 정의에서 초기화해야이 @와 클래스 변수입니다.

수업 방법 데프 self.methodname ()정의, 구분 기호를 종료 클래스 메소드. 이하의 실시 예에 도시 된 바와 같이 클래스 메소드가 호출의 클래스 이름classname.methodname 형태로 사용될 수있다 :

#!/usr/bin/ruby -w

class Box
   # 初始化类变量
   @@count = 0
   def initialize(w,h)
      # 给实例变量赋值
      @width, @height = w, h

      @@count += 1
   end

   def self.printCount()
      puts "Box count is : #@@count"
   end
end

# 创建两个对象
box1 = Box.new(10, 20)
box2 = Box.new(30, 100)

# 调用类方法来输出盒子计数
Box.printCount()

상기 코드가 실행되는 경우, 다음과 같은 결과를 생성 할 것이다 :

Box count is : 2

그리고 to_s 방법

모든 클래스는 객체의 문자열 표현을 반환 정의한그리고 to_s 인스턴스 메소드가 있습니다.다음은 간단한 예는 폭과 높이에 따르면, 상자 객체를 나타낸다 :

#!/usr/bin/ruby -w

class Box
   # 构造器方法
   def initialize(w,h)
      @width, @height = w, h
   end
   # 定义 to_s 方法
   def to_s
      "(w:#@width,h:#@height)"  # 对象的字符串格式
   end
end

# 创建对象
box = Box.new(10, 20)

# 自动调用 to_s 方法
puts "String representation of box is : #{box}"

상기 코드가 실행되는 경우, 다음과 같은 결과를 생성 할 것이다 :

String representation of box is : (w:10,h:20)

액세스 제어

루비, 공공 개인 또는 보호되어 보호 인스턴스 메소드의 세 가지 수준을 제공합니다.액세스 제어 애플리케이션 루비 인스턴스 클래스 변수 아니다.

  • 공공 방법 : 공공 방법은 모든 객체를 호출 할 수 있습니다.initialize 메소드 항상 비공개 제외하고는 기본적으로 방법이 공개됩니다.
  • 개인 방법 : 개인 방법은 액세스하거나 클래스 외부에서 볼 수 없습니다.단지 클래스 메소드는 private 멤버에 액세스 할 수 있습니다.
  • 보호 방법 : 보호 방법은 객체 클래스와 그 서브 클래스 호출 할 수 있습니다.접근은 내부 클래스 및 서브 클래스에 수행 될 수있다.

여기에 세 가지 수정 구문을 보여주는 간단한 예입니다 :

#!/usr/bin/ruby -w

# 定义类
class Box
   # 构造器方法
   def initialize(w,h)
      @width, @height = w, h
   end

   # 实例方法默认是 public 的
   def getArea
      getWidth() * getHeight
   end

   # 定义 private 的访问器方法
   def getWidth
      @width
   end
   def getHeight
      @height
   end
   # make them private
   private :getWidth, :getHeight

   # 用于输出面积的实例方法
   def printArea
      @area = getWidth() * getHeight
      puts "Big box area is : #@area"
   end
   # 让实例方法是 protected 的
   protected :printArea
end

# 创建对象
box = Box.new(10, 20)

# 调用实例方法
a = box.getArea()
puts "Area of the box is : #{a}"

# 尝试调用 protected 的实例方法
box.printArea()

위의 코드가 실행될 때, 다음의 결과를 얻을 것이다. 여기서, 제 메소드 호출이 성공하지만, 두 번째 방법은 문제를 가질 것이다.

Area of the box is : 200
test.rb:42: protected method `printArea' called for #
<Box:0xb7f11280 @height=20, @width=10> (NoMethodError)

클래스 상속

상속, 객체 지향 프로그래밍에서 가장 중요한 개념 중 하나입니다. 상속은 우리가 만들고 응용 프로그램을 더 쉽게 유지해 나가는 것을 다른 클래스를 기반으로 클래스를 정의 할 수 있습니다.

상속은 코드와 빠른 실행, 불행하게도, 루비가 지원하지 않는 다중 상속을 재사용하는 데 도움이,하지만 루비 지원유지 mixin.믹스 인은 다중 상속, 다중 상속의 특정 구현과 같은 인터페이스의 일부가 상속입니다.

당신이 클래스를 만들 때, 프로그래머는 회원의 기존 클래스에서 상속하는 새로운 클래스를 지정할 수 있습니다, 그래서 처음부터 새로운 데이터 멤버와 멤버 함수를 작성하지 않습니다. 기존 클래스는기본 클래스 또는 상위 클래스라고, 새로운 클래스는 파생 클래스 나 서브 클래스라고합니다.

루비는 상속하는 하위 개념의 서브 클래스가, 다음 예제는이 개념을 설명합니다. 클래스 구문을 확장하는 것은 매우 간단합니다. 그냥 <캐릭터 이름과 클래스 문 캔에 부모 클래스를 추가합니다. 예를 들어, 다음 클래스BigBox박스가 서브 클래스 정의

#!/usr/bin/ruby -w

# 定义类
class Box
   # 构造器方法
   def initialize(w,h)
      @width, @height = w, h
   end
   # 实例方法
   def getArea
      @width * @height
   end
end

# 定义子类
class BigBox < Box

   # 添加一个新的实例方法
   def printArea
      @area = @width * @height
      puts "Big box area is : #@area"
   end
end

# 创建对象
box = BigBox.new(10, 20)

# 输出面积
box.printArea()

상기 코드가 실행되는 경우, 다음과 같은 결과를 생성 할 것이다 :

Big box area is : 200

메소드 오버로딩

당신은 파생 클래스에 새로운 기능을 추가 할 수 있지만 때로는 부모 클래스 메소드에 정의 된 동작을 변경할 수도있다. 그런 다음 예와 같이 함수, 방법 과부하 될 수 있고, 동일한 방법 이름을 유지할 수있다 :

#!/usr/bin/ruby -w

# 定义类
class Box
   # 构造器方法
   def initialize(w,h)
      @width, @height = w, h
   end
   # 实例方法
   def getArea
      @width * @height
   end
end

# 定义子类
class BigBox < Box

   # 改变已有的 getArea 方法
   def getArea
      @area = @width * @height
      puts "Big box area is : #@area"
   end
end

# 创建对象
box = BigBox.new(10, 20)

# 使用重载的方法输出面积
box.getArea()

위의 예제 출력은 실행

Big box area is : 200

연산자 오버로딩

우리는 박스의 폭과 높이로 * 연산자를 사용 단항 연산자를 사용하여 곱의 + 연산자 개의 박스 객체 벡터 덧셈을 수행 사용할 - 박스의 폭과 높이가 무효화. 여기에 박스 운영자의 정의와 수학 수업의 버전은 다음과 같습니다

class Box
  def initialize(w,h) # 初始化 width 和 height
    @width,@height = w, h
  end

  def +(other)         # 定义 + 来执行向量加法
    Box.new(@width + other.width, @height + other.height)
  end

  def -@               # 定义一元运算符 - 来对 width 和 height 求反
    Box.new(-@width, -@height)
  end

  def *(scalar)        # 执行标量乘法
    Box.new(@width*scalar, @height*scalar)
  end
end

냉동 객체

때때로 우리는 객체가 변경되지 않도록하려면. 개체에서 동결 방법은 효과적으로 일정에 객체를 넣을 수 있습니다,이를 얻을 수 있습니다. 모든 개체는Object.freeze를 호출하여 고정 할 수 있습니다.냉동 개체 즉, 사용자가 해당 인스턴스 변수를 변경할 수는 변경 될 수 없다.

당신은 주어진 객체가 고정되었는지 여부를 확인하기 위해Object.frozen? 방법을 사용할 수 있습니다.객체가 고정 된 경우,이 방법은, 그렇지 않으면 거짓 값을 반환 true를 반환. 다음 예제에서는이 개념을 보여줍니다 :

#!/usr/bin/ruby -w

# 定义类
class Box
   # 构造器方法
   def initialize(w,h)
      @width, @height = w, h
   end

   # 访问器方法
   def getWidth
      @width
   end
   def getHeight
      @height
   end

   # 设置器方法
   def setWidth=(value)
      @width = value
   end
   def setHeight=(value)
      @height = value
   end
end

# 创建对象
box = Box.new(10, 20)

# 让我们冻结该对象
box.freeze
if( box.frozen? )
   puts "Box object is frozen object"
else
   puts "Box object is normal object"
end

# 现在尝试使用设置器方法
box.setWidth = 30
box.setHeight = 50

# 使用访问器方法
x = box.getWidth()
y = box.getHeight()

puts "Width of the box is : #{x}"
puts "Height of the box is : #{y}"

상기 코드가 실행되는 경우, 다음과 같은 결과를 생성 할 것이다 :

Box object is frozen object
test.rb:20:in `setWidth=': can't modify frozen object (TypeError)
        from test.rb:39

클래스 상수

당신은 상수 사용 @ 또는 @@ 필요로하지 않는 변수 정의에 직접 숫자 나 문자열 값으로, 일정한 내부 클래스를 정의 할 수 있습니다. 규칙에 의해, 지속적인 사용 대문자의 이름입니다.

상수가 정의되면, 당신은 같은 변수에 대한 액세스와 같이 직접 클래스에서 내부 상수에 액세스 할 수 있습니다, 그 값을 변경할 수는 없지만 외부 일정 클래스에 액세스하려면, 당신은클래스 명 :: 상수를 사용합니다 다음 예와 같이.

#!/usr/bin/ruby -w

# 定义类
class Box
   BOX_COMPANY = "TATA Inc"
   BOXWEIGHT = 10
   # 构造器方法
   def initialize(w,h)
      @width, @height = w, h
   end
   # 实例方法
   def getArea
      @width * @height
   end
end

# 创建对象
box = Box.new(10, 20)

# 调用实例方法
a = box.getArea()
puts "Area of the box is : #{a}"
puts Box::BOX_COMPANY
puts "Box weight is: #{Box::BOXWEIGHT}"

상기 코드가 실행되는 경우, 다음과 같은 결과를 생성 할 것이다 :

Area of the box is : 200
TATA Inc
Box weight is: 10

인스턴스 메소드가 과부하로 클래스 상수는 동일한 상속 될 수 있지만.

객체를 생성 할당 사용

경우가있을 수 있습니다, 당신은 생성자는 객체를초기화 호출하지 않고 개체를 만들려면, 그 목적은 새로운 방법을 사용하여 생성되고,이 경우, 다음과 같은 예로서, 초기화되지 않은 개체를 만드는 데 할당 호출 할 수 있습니다 다음과 같은 :

#!/usr/bin/ruby -w

# 定义类
class Box
   attr_accessor :width, :height

   # 构造器方法
   def initialize(w,h)
      @width, @height = w, h
   end

   # 实例方法
   def getArea
      @width * @height
   end
end

# 使用 new 创建对象
box1 = Box.new(10, 20)

# 使用 allocate 创建两一个对象
box2 = Box.allocate

# 使用 box1 调用实例方法
a = box1.getArea()
puts "Area of the box is : #{a}"

# 使用 box2 调用实例方法
a = box2.getArea()
puts "Area of the box is : #{a}"

상기 코드가 실행되는 경우, 다음과 같은 결과를 생성 할 것이다 :

Area of the box is : 200
test.rb:14: warning: instance variable @width not initialized
test.rb:14: warning: instance variable @height not initialized
test.rb:14:in `getArea': undefined method `*' 
   for nil:NilClass (NoMethodError) from test.rb:29

클래스 정보

루비의 자아와 자바는이 비슷하지만 다르다. Java 메소드는 인스턴스 메서드에서 참조하는, 그래서 이것은 일반적으로 현재의 객체를 참조합니다. 라인으로 루비 코드 라인, 다른 컨텍스트 (문맥) 자체에서 매우 다른 의미를 갖는다. 이제 다음 예를 살펴 보자 :

#!/usr/bin/ruby -w

class Box
   # 输出类信息
   puts "Class of self = #{self.class}"
   puts "Name of self = #{self.name}"
end

상기 코드가 실행되는 경우, 다음과 같은 결과를 생성 할 것이다 :

Class of self = Class
Name of self = Box

이 클래스가 실행하는 현재 대상으로하는 클래스에 의해 정의 될 수 있다는 것을 의미 할뿐만 아니라 프로세스 실행 동안 메타 클래스와 상위 클래스에있어서의 정의가 이용 가능하다는 것을 의미한다.