CoffeeScript - Sınıflar ve Kalıtım

JavaScript, classanahtar kelime. Nesneleri ve prototiplerini kullanarak JavaScript'te kalıtım elde edebiliriz. Her nesnenin kendi prototipi vardır ve prototiplerinden işlevleri ve özellikleri miras alırlar. Prototip aynı zamanda bir nesne olduğu için kendi prototipine de sahiptir.

Prototip kalıtım, klasik kalıtımdan çok daha güçlü olsa da, acemi kullanıcılar için zor ve kafa karıştırıcıdır.

CoffeeScript'te Sınıflar

CoffeeScript, bu soruna değinen temel bir yapı sağlar: classJavaScript'in prototipleri kullanılarak oluşturulmuştur. CoffeeScript'te, aşağıda gösterildiği gibi class anahtar sözcüğünü kullanarak bir sınıf tanımlayabilirsiniz.

class Class_Name

Misal

Aşağıdaki örneği düşünün, burada adında bir sınıf oluşturduk Student anahtar kelimeyi kullanarak class.

class Student

Yukarıdaki kodu derlerseniz, aşağıdaki JavaScript'i oluşturacaktır.

var Student;

Student = (function() {
  function Student() {}

  return Student;

})();

Bir sınıfın örneklenmesi

Aşağıda gösterildiği gibi diğer nesne yönelimli programlama dilleri gibi, new operatörü kullanarak bir sınıfı başlatabiliriz.

new Class_Name

Yukarıda oluşturulan (Öğrenci) sınıfını, new Operatör aşağıda gösterildiği gibi.

class Student
new  Student

Yukarıdaki kodu derlerseniz, aşağıdaki JavaScript'i oluşturacaktır.

var Student;

Student = (function() {
  function Student() {}

  return Student;

})();

new Student;

Bir Oluşturucu Tanımlama

Yapıcı, bir sınıfı başlattığımızda çağrılan bir işlevdir, ana amacı örnek değişkenlerini başlatmaktır. CoffeeScript'te, yalnızca adla bir işlev oluşturarak bir kurucu tanımlayabilirsiniz.constructor Aşağıda gösterildiği gibi.

class Student
  constructor: (name)->
  @name = name

Burada bir kurucu tanımladık ve yerel değişken adını örnek değişkenine atadık.

@ operatörün takma adıdır this anahtar kelime, bir sınıfın örnek değişkenlerini işaret etmek için kullanılır.

Eğer yerleştirirsek @yapıcının bir bağımsız değişkeninden önce, otomatik olarak bir örnek değişkeni olarak ayarlanacaktır. Bu nedenle, yukarıdaki kod aşağıda gösterildiği gibi basitçe yazılabilir -

class Student
  constructor: (@name)->

Misal

CoffeeScript'te bir oluşturucu örneği. Adıyla bir dosyaya kaydedinconstructor_example.coffee

#Defining a class
class Student
  constructor: (@name)->

#instantiating a class by passing a string to constructor
student = new Student("Mohammed");
console.log "the name of the student is :"+student.name

Compiling the code

Komut istemini açın ve yukarıdaki örneği aşağıda gösterildiği gibi derleyin.

c:\>coffee -c constructor_example.coffee

Yukarıdaki komutu yürütürken aşağıdaki JavaScript'i üretecektir.

// Generated by CoffeeScript 1.10.0
(function() {
  var Student, student;

  Student = (function() {
    function Student(name) {
      this.name = name;
    }

    return Student;

  })();

  student = new Student("Mohammed");

  console.log("The name of the student is :"+student.name);

}).call(this);

Executing the Code

Komut isteminde aşağıdaki komutu çalıştırarak yukarıdaki örneği çalıştırın.

coffee constructor_example.coffee

Çalışırken, yukarıdaki örnek size aşağıdaki çıktıyı verir.

The name of the student is :Mohammed

Örnek Özellikleri

Nesnelerde olduğu gibi, bir sınıf içinde de özelliklere sahip olabiliriz. Ve bunlar şu şekilde bilinirinstance properties.

Misal

Aşağıdaki örneği düşünün. Burada sınıf içerisinde değişkenler (isim, yaş) ve bir fonksiyon (mesaj ()) oluşturduk ve nesnesini kullanarak bunlara eriştik. Bu örneği adlı bir dosyaya kaydedin.instance_properties_example.coffee

#Defining a class
class Student
  name="Ravi"
  age=24
  message: ->
    "Hello "+name+" how are you" 

#instantiating a class by passing a string to constructor
student = new Student();
console.log student.message()

Derleme sırasında yukarıdaki kod aşağıdaki çıktıyı üretir.

// Generated by CoffeeScript 1.10.0
(function() {
  var Student, student;

  Student = (function() {
    var age, name;

    function Student() {}

    name = "Ravi";

    age = 24;

    Student.prototype.message = function() {
      return "Hello " + name + " how are you";
    };

    return Student;

  })();

  student = new Student();

  console.log(student.message());

}).call(this);

Statik Özellikler

Sınıfta statik özellikler tanımlayabiliriz. Statik özelliklerin kapsamı sınıf içinde sınırlandırılmıştır vethis keyword veya takma adı @sembol ve bu özelliklere Class_Name.property olarak sınıf adını kullanarak erişmeliyiz .

Misal

Aşağıdaki örnekte, message adında bir statik fonksiyon oluşturduk. ve ona erişti. Adıyla bir dosyaya kaydedinstatic_properties_example.coffee.

#Defining a class
class Student
  @message:(name) ->
    "Hello "+name+" how are you" 
console.log Student.message("Raju")

Komut istemini açın ve yukarıdaki CoffeeScript dosyasını aşağıdaki komutu kullanarak derleyin.

c:\>coffee -c  static_properties_example.coffee

Derlemede size aşağıdaki JavaScript'i verir.

// Generated by CoffeeScript 1.10.0
(function() {
  var Student;

  Student = (function() {
    function Student() {}

    Student.message = function(name) {
      return "Hello " + name + " how are you";
    };

    return Student;

  })();

  console.log(Student.message("Raju"));

}).call(this);

Yukarıdaki coffeeScript'i aşağıda gösterildiği gibi komut isteminde çalıştırın.

c:\>coffee static_properties_example.coffee

Yürütüldüğünde, yukarıdaki örnek size aşağıdaki çıktıyı verir.

Hello Raju how are you

Miras

CoffeeScript'te, bir sınıfın özelliklerini başka bir sınıfın özelliklerini kullanarak miras alabiliriz extends anahtar kelime.

Misal

Aşağıda, CoffeeScript'te bir miras örneği verilmiştir. Burada iki sınıfımız var:Add ve My_class. My_class sınıfında Add adlı sınıfın özelliklerini miras aldık ve bunlaraextends anahtar kelime.

#Defining a class
class Add
   a=20;b=30
   
   addition:->
     console.log "Sum of the two numbers is :"+(a+b) 

class My_class extends Add

my_class = new My_class()
my_class.addition()

CoffeeScript, perde arkasında prototip kalıtım kullanır. CoffeeScript'te, örnekler oluşturduğumuzda, üst sınıfın yapıcısı biz onu geçersiz kılana kadar çağrılır.

Alt sınıftan üst sınıfın yapıcısını kullanarak, super() aşağıda verilen örnekte gösterildiği gibi anahtar kelime.

#Defining a class
class Add
   constructor:(@a,@b) ->
   
   addition:=>
     console.log "Sum of the two numbers is :"+(@a+@b) 

class Mul extends Add
   constructor:(@a,@b) ->
     super(@a,@b)
   
   multiplication:->
     console.log "Product of the two numbers is :"+(@a*@b)

mul = new Mul(10,20)
mul.addition()
mul.multiplication()

Dinamik Sınıflar

CoffeeScript, bir sınıfın tüm örnek özelliklerini otomatik olarak devralmak için prototip mirasını kullanır. Bu, sınıfların dinamik olmasını sağlar; Bir alt sınıf oluşturulduktan sonra bir üst sınıfa özellikler ekleseniz bile, özellik, miras alınan tüm alt sınıflarına yayılır.

class Animal
  constructor: (@name) ->

class Parrot extends Animal

Animal::rip = true

parrot = new Parrot("Macaw")
console.log "This parrot is no more" if parrot.rip

Yürütüldüğünde, yukarıdaki CoffeeScript aşağıdaki JavaScript kodunu oluşturur.

// Generated by CoffeeScript 1.10.0
(function() {
  var Animal, Parrot, parrot,
    extend = function(child, parent) { for (var key in parent) {
      if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() {
      this.constructor = child; } ctor.prototype = parent.prototype;
      child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  Animal = (function() {
    function Animal(name) {
      this.name = name;
    }

    return Animal;

  })();

  Parrot = (function(superClass) {
    extend(Parrot, superClass);

    function Parrot() {
      return Parrot.__super__.constructor.apply(this, arguments);
    }

    return Parrot;

  })(Animal);

  Animal.prototype.rip = true;

  parrot = new Parrot("Macaw");

  if (parrot.rip) {
    console.log("This parrot is no more");
  }
  
}).call(this);