Ruby - Nesne Yönelimli

Ruby saf bir nesne yönelimli dildir ve her şey Ruby'ye bir nesne olarak görünür. Ruby'deki her değer bir nesnedir, hatta en ilkel şeyler: dizeler, sayılar ve hatta doğru ve yanlış. Bir sınıfın kendisi bile Class sınıfının bir örneği olan bir nesnedir . Bu bölüm sizi Nesne Yönelimli Ruby ile ilgili tüm temel işlevlere götürecektir.

Sınıf, bir nesnenin biçimini belirtmek için kullanılır ve veri gösterimini ve bu verileri tek bir düzgün pakette işlemek için yöntemleri birleştirir. Bir sınıf içindeki veriler ve yöntemler, sınıfın üyeleri olarak adlandırılır.

Ruby Sınıfı Tanımı

Bir sınıf tanımladığınızda, bir veri türü için bir plan tanımlarsınız. Bu aslında herhangi bir veriyi tanımlamaz, ancak sınıf adının ne anlama geldiğini, yani sınıfın bir nesnesinin ne içereceğini ve böyle bir nesne üzerinde hangi işlemlerin gerçekleştirilebileceğini tanımlar.

Bir sınıf tanımı, anahtar kelimeyle başlar class ardından class name ve bir ile sınırlandırılmıştır end. Örneğin, sınıf anahtar kelimesini kullanarak Box sınıfını aşağıdaki gibi tanımladık -

class Box
   code
end

İsim büyük harfle başlamalıdır ve birden fazla kelime içeren kurallara göre isimler her kelime büyük harfle yazılır ve ayırıcı karakterler (CamelCase) kullanılmaz.

Ruby Nesnelerini Tanımlayın

Bir sınıf, nesnelerin planlarını sağlar, bu nedenle temelde bir sınıftan bir nesne oluşturulur. Bir sınıfın nesnelerininewanahtar kelime. Aşağıdaki ifadeler Box sınıfının iki nesnesini bildirir -

box1 = Box.new
box2 = Box.new

Başlatma Yöntemi

initialize method standart bir Ruby sınıfı yöntemidir ve neredeyse aynı şekilde çalışır constructordiğer nesne yönelimli programlama dillerinde çalışır. Başlatma yöntemi, nesne oluşturma sırasında bazı sınıf değişkenlerini başlatmak istediğinizde kullanışlıdır. Bu yöntem, bir parametre listesi alabilir ve diğer herhangi bir yakut yöntemi gibi, öncesindedef aşağıda gösterildiği gibi anahtar kelime -

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

Örnek Değişkenler

instance variablesbir tür sınıf nitelikleridir ve sınıf kullanılarak nesneler oluşturulduktan sonra nesnelerin özellikleri haline gelirler. Her nesnenin nitelikleri ayrı ayrı atanır ve diğer nesnelerle hiçbir değeri paylaşmaz. Sınıf içinde @ operatörü kullanılarak erişilir, ancak kullandığımız sınıfın dışında bunlara erişmek içinpublic denilen yöntemler accessor methods. Yukarıda tanımlanan sınıfı alırsakBox @width ve @height, Box sınıfı için örnek değişkenlerdir.

class Box
   def initialize(w,h)
      # assign instance variables
      @width, @height = w, h
   end
end

Erişimci ve ayarlayıcı Yöntemleri

Değişkenleri sınıfın dışından erişilebilir kılmak için, bunların içinde tanımlanmaları gerekir. accessor methodsbu erişimci yöntemleri aynı zamanda alıcı yöntemler olarak da bilinir. Aşağıdaki örnek, erişimci yöntemlerinin kullanımını göstermektedir -

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end

   # accessor methods
   def printWidth
      @width
   end

   def printHeight
      @height
   end
end

# create an object
box = Box.new(10, 20)

# use accessor methods
x = box.printWidth()
y = box.printHeight()

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

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

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

Değişkenlerin değerine erişmek için kullanılan erişimci yöntemlerine benzer şekilde Ruby, bu değişkenlerin değerlerini sınıfın dışından ayarlamak için bir yol sağlar. setter methodsaşağıdaki gibi tanımlananlar -

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end

   # accessor methods
   def getWidth
      @width
   end
   def getHeight
      @height
   end

   # setter methods
   def setWidth=(value)
      @width = value
   end
   def setHeight=(value)
      @height = value
   end
end

# create an object
box = Box.new(10, 20)

# use setter methods
box.setWidth = 30
box.setHeight = 50

# use accessor methods
x = box.getWidth()
y = box.getHeight()

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

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

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

Örnek Yöntemler

instance methods aynı zamanda başka herhangi bir yöntemi kullanarak tanımladığımız şekilde tanımlanır defanahtar kelime ve bunlar yalnızca aşağıda gösterildiği gibi bir sınıf örneği kullanılarak kullanılabilir. İşlevleri, örnek değişkenlerine erişimle sınırlı değildir, aynı zamanda gereksinimlerinize göre çok daha fazlasını da yapabilirler.

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # instance method
   def getArea
      @width * @height
   end
end

# create an object
box = Box.new(10, 20)

# call instance methods
a = box.getArea()
puts "Area of the box is : #{a}"

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

Area of the box is : 200

Sınıf Yöntemler ve Değişkenler

class variablesbir sınıfın tüm örnekleri arasında paylaşılan bir değişkendir. Başka bir deyişle, değişkenin bir örneği vardır ve buna nesne örnekleri tarafından erişilir. Sınıf değişkenlerinin önünde iki @ karakter (@@) bulunur. Bir sınıf değişkeni, aşağıda gösterildiği gibi sınıf tanımı içinde başlatılmalıdır.

Bir sınıf yöntemi kullanılarak tanımlanır def self.methodname(), son sınırlayıcı ile biten ve sınıf adı olarak kullanılarak çağrılacak classname.methodname aşağıdaki örnekte gösterildiği gibi -

#!/usr/bin/ruby -w

class Box
   # Initialize our class variables
   @@count = 0
   def initialize(w,h)
      # assign instance avriables
      @width, @height = w, h

      @@count += 1
   end

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

# create two object
box1 = Box.new(10, 20)
box2 = Box.new(30, 100)

# call class method to print box count
Box.printCount()

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

Box count is : 2

To_s Yöntemi

Tanımladığınız herhangi bir sınıfın bir to_snesnenin dize gösterimini döndürmek için örnek yöntem. Aşağıda, bir Box nesnesini genişlik ve yükseklik açısından temsil etmek için basit bir örnek verilmiştir -

#!/usr/bin/ruby -w

class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # define to_s method
   def to_s
      "(w:#@width,h:#@height)"  # string formatting of the object.
   end
end

# create an object
box = Box.new(10, 20)

# to_s method will be called in reference of string automatically.
puts "String representation of box is : #{box}"

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

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

Giriş kontrolu

Ruby, örnek yöntemleri düzeyinde size üç koruma düzeyi sağlar; public, private, or protected. Ruby, örnek ve sınıf değişkenleri üzerinde herhangi bir erişim denetimi uygulamaz.

  • Public Methods- Herkese açık yöntemler herkes tarafından çağrılabilir. Her zaman özel olan başlatma dışında yöntemler varsayılan olarak geneldir.

  • Private Methods- Özel yöntemlere erişilemez ve hatta sınıfın dışından görüntülenemez. Özel üyelere yalnızca sınıf yöntemleri erişebilir.

  • Protected Methods- Korumalı bir yöntem yalnızca tanımlayıcı sınıfın nesneleri ve alt sınıfları tarafından çağrılabilir. Erişim aile içinde tutulur.

Aşağıda, üç erişim değiştiricinin tümünün sözdizimini gösteren basit bir örnek verilmiştir -

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end

   # instance method by default it is public
   def getArea
      getWidth() * getHeight
   end

   # define private accessor methods
   def getWidth
      @width
   end
   def getHeight
      @height
   end
   # make them private
   private :getWidth, :getHeight

   # instance method to print area
   def printArea
      @area = getWidth() * getHeight
      puts "Big box area is : #@area"
   end
   # make it protected
   protected :printArea
end

# create an object
box = Box.new(10, 20)

# call instance methods
a = box.getArea()
puts "Area of the box is : #{a}"

# try to call protected or methods
box.printArea()

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir. Burada birinci yöntem başarıyla çağrılırken, ikinci yöntem sorun yaratmıştır.

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

Sınıf Mirası

Nesne yönelimli programlamadaki en önemli kavramlardan biri kalıtımdır. Kalıtım, bir sınıfı başka bir sınıf açısından tanımlamamıza izin verir, bu da bir uygulama oluşturmayı ve sürdürmeyi kolaylaştırır.

Kalıtım ayrıca kod işlevselliğini ve hızlı uygulama süresini yeniden kullanma fırsatı da sağlar, ancak maalesef Ruby birden fazla kalıtım düzeyini desteklemez ancak Ruby destekler mixins. Bir karışım, yalnızca arayüz kısmının miras alındığı çoklu kalıtımın özelleştirilmiş bir uygulaması gibidir.

Bir sınıf oluştururken, tamamen yeni veri üyeleri ve üye işlevler yazmak yerine, programcı yeni sınıfın mevcut bir sınıfın üyelerini miras alması gerektiğini belirleyebilir. Bu mevcut sınıfabase class or superclassve yeni sınıfa, derived class or sub-class.

Ruby ayrıca alt sınıflandırma, yani kalıtım kavramını da destekler ve aşağıdaki örnek kavramı açıklar. Bir sınıfı genişletmenin sözdizimi basittir. Sınıf ifadenize bir <karakteri ve üst sınıfın adını eklemeniz yeterlidir. Örneğin, aşağıdaki bir sınıf BigBox'ı Box'ın bir alt sınıfı olarak tanımlayın -

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # instance method
   def getArea
      @width * @height
   end
end

# define a subclass
class BigBox < Box

   # add a new instance method
   def printArea
      @area = @width * @height
      puts "Big box area is : #@area"
   end
end

# create an object
box = BigBox.new(10, 20)

# print the area
box.printArea()

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

Big box area is : 200

Geçersiz Kılma Yöntemleri

Türetilmiş bir sınıfa yeni işlevler ekleyebilseniz de, ancak bazen bir üst sınıfta önceden tanımlanmış yöntemin davranışını değiştirmek istersiniz. Bunu, yöntem adını aynı tutarak ve aşağıdaki örnekte gösterildiği gibi yöntemin işlevselliğini geçersiz kılarak yapabilirsiniz -

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # instance method
   def getArea
      @width * @height
   end
end

# define a subclass
class BigBox < Box

   # change existing getArea method as follows
   def getArea
      @area = @width * @height
      puts "Big box area is : #@area"
   end
end

# create an object
box = BigBox.new(10, 20)

# print the area using overriden method.
box.getArea()

Operatör Aşırı Yüklemesi

+ Operatörünün + kullanarak iki Box nesnesinin vektör toplamasını gerçekleştirmesini, * operatörünün bir Box genişliğini ve yüksekliğini bir skaler ile çarpmasını ve tekli - operatörünün Box'ın genişliğini ve yüksekliğini olumsuzlamasını istiyoruz. Burada, matematiksel işleçlerin tanımlandığı Box sınıfının bir sürümü verilmiştir -

class Box
   def initialize(w,h)     # Initialize the width and height
      @width,@height = w, h
   end

   def +(other)       # Define + to do vector addition
      Box.new(@width + other.width, @height + other.height)
   end

   def -@           # Define unary minus to negate width and height
      Box.new(-@width, -@height)
   end

   def *(scalar)           # To perform scalar multiplication
      Box.new(@width*scalar, @height*scalar)
   end
end

Nesneleri Dondurmak

Bazen bir nesnenin değiştirilmesini önlemek isteriz. Object'teki dondurma yöntemi, bir nesneyi etkin bir şekilde sabit hale getirerek bunu yapmamızı sağlar. Herhangi bir nesne çağırılarak dondurulabilirObject.freeze. Dondurulmuş bir nesne değiştirilemez: onun örnek değişkenlerini değiştiremezsiniz.

Belirli bir nesnenin donmuş olup olmadığını kontrol edebilirsiniz. Object.frozen?yöntem, nesnenin donması durumunda true değerini döndürür, aksi takdirde yanlış bir değer döndürülür. Aşağıdaki örnek kavramı netleştirir -

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end

   # accessor methods
   def getWidth
      @width
   end
   def getHeight
      @height
   end

   # setter methods
   def setWidth=(value)
      @width = value
   end
   def setHeight=(value)
      @height = value
   end
end

# create an object
box = Box.new(10, 20)

# let us freez this object
box.freeze
if( box.frozen? )
   puts "Box object is frozen object"
else
   puts "Box object is normal object"
end

# now try using setter methods
box.setWidth = 30
box.setHeight = 50

# use accessor methods
x = box.getWidth()
y = box.getHeight()

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

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

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

Sınıf Sabitleri

Bir değişkene, @ veya @@ kullanılmadan tanımlanan bir doğrudan sayısal veya dize değeri atayarak bir sınıf içinde bir sabit tanımlayabilirsiniz. Geleneksel olarak, sabit isimleri büyük harfle tutuyoruz.

Bir sabit tanımlandıktan sonra, değerini değiştiremezsiniz, ancak bir değişkene çok benzer şekilde bir sınıfın içinden doğrudan bir sabite erişebilirsiniz, ancak sınıfın dışındaki bir sabite erişmek istiyorsanız, o zaman kullanmanız gerekir classname::constant aşağıdaki örnekte gösterildiği gibi.

#!/usr/bin/ruby -w

# define a class
class Box
   BOX_COMPANY = "TATA Inc"
   BOXWEIGHT = 10
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # instance method
   def getArea
      @width * @height
   end
end

# create an object
box = Box.new(10, 20)

# call instance methods
a = box.getArea()
puts "Area of the box is : #{a}"
puts Box::BOX_COMPANY
puts "Box weight is: #{Box::BOXWEIGHT}"

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

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

Sınıf sabitleri miras alınır ve örnek yöntemleri gibi geçersiz kılınabilir.

Allocate Kullanarak Nesne Oluşturun

Yapıcısını çağırmadan bir nesne oluşturmak istediğinizde bir durum olabilir. initializeör. yeni yöntemi kullanarak, böyle bir durumda ayırmayı çağırabilirsiniz , bu da sizin için aşağıdaki örnekte olduğu gibi başlatılmamış bir nesne yaratacaktır -

#!/usr/bin/ruby -w

# define a class
class Box
   attr_accessor :width, :height

   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end

   # instance method
   def getArea
      @width * @height
   end
end

# create an object using new
box1 = Box.new(10, 20)

# create another object using allocate
box2 = Box.allocate

# call instance method using box1
a = box1.getArea()
puts "Area of the box is : #{a}"

# call instance method using box2
a = box2.getArea()
puts "Area of the box is : #{a}"

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

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

Sınıf Bilgileri

Sınıf tanımları çalıştırılabilir kodsa, bu onların bir nesne bağlamında yürütüldüğü anlamına gelir: self bir şeye başvurmalıdır. Ne olduğunu öğrenelim.

#!/usr/bin/ruby -w

class Box
   # print class information
   puts "Type of self = #{self.type}"
   puts "Name of self = #{self.name}"
end

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

Type of self = Class
Name of self = Box

Bu, bir sınıf tanımının o sınıfla geçerli nesne olarak yürütüldüğü anlamına gelir. Bu, metasınıf ve üst sınıflarındaki yöntemlerin, yöntem tanımının yürütülmesi sırasında kullanılabileceği anlamına gelir.