1. Anasayfa
  2. 100 Günde Solidity

🧵 #100GündeSolidity 023 : Inheritance – Kalıtım

🧵 #100GündeSolidity 023 : Inheritance – Kalıtım
Inheritance
0

Inheritance – Kalıtım Hakkında Detaylar ve Önemli Noktalar

Solidity dilinde, bir sözleşmenin diğer sözleşmelerden kalıtım alması mümkündür. Bu işlem “is” anahtar kelimesi kullanılarak yapılır ve kalıtım yapılan sözleşmelerin fonksiyonları geçersiz kılmak veya üzerine yazmak için virtual ve override anahtar kelimeleri kullanılır. Kalıtım sırası önemlidir ve ebeveyn sözleşmeler en “taban benzeri” olandan en “derlenmiş” olan sıraya göre listelenmelidir.

Solidity dilinde birden fazla ebeveyn sözleşmeden kalıtım almak mümkündür. Bu, bir sözleşmenin birçok sözleşmeden fonksiyonları ve özelliklerini kalıtım yoluyla kullanmasına olanak tanır.

“is” anahtar kelimesi, Solidity dilinde bir sözleşmenin başka bir sözleşmeden kalıtım almasını sağlar. Kalıtım yapmak istediğiniz sözleşmenin tanımından hemen sonra “is” anahtar kelimesi kullanılır ve ardından kalıtım yapılacak sözleşmenin adı verilir. Örnek olarak:

contract ParentContract {
  function parentFunction() public pure {}
}

contract ChildContract is ParentContract {
  // ChildContract can now use the parentFunction from ParentContract
}

Bu şekilde, ChildContract sözleşmesi ParentContract sözleşmesinden kalıtım almış ve parentFunction fonksiyonunu kullanma hakkına sahip olmuştur.

Solidity dilinde, ebeveyn sözleşmenin fonksiyonları çocuk sözleşmeler tarafından geçersiz kılınabilir. Bu işlem yapmak istediğiniz fonksiyonları virtual olarak tanımlamanız gerekir. Virtual olarak tanımlanmış fonksiyonlar, çocuk sözleşmeler tarafından geçersiz kılınabilir veya üzerine yazılabilir. Örnek olarak:

contract ParentContract {
  function parentFunction() virtual public pure {}
}

contract ChildContract is ParentContract {
  function parentFunction() override public pure {}
  // This function overrides the parentFunction from ParentContract
}

Bu şekilde, ParentContract sözleşmesindeki parentFunction fonksiyonu virtual olarak tanımlanmış ve ChildContract sözleşmesinde override anahtar kelimesi kullanılarak geçersiz kılınmıştır.

Ebeveyn Fonksiyon Geçersizliği

Solidity dilinde, çocuk sözleşmeler ebeveyn sözleşmelerdeki fonksiyonları geçersiz kılmak için override anahtar kelimesini kullanabilirler. Bu anahtar kelime, çocuk sözleşmenin ebeveyn sözleşmedeki fonksiyonları geçersiz kılacağını ve fonksiyonun içeriğinin değiştirileceğini gösterir. Örnek olarak:

contract ParentContract {
  function parentFunction() virtual public pure {}
}

contract ChildContract is ParentContract {
  function parentFunction() override public pure {}
  // This function overrides the parentFunction from ParentContract
}

Bu şekilde, ChildContract sözleşmesindeki parentFunction fonksiyonu, ParentContract sözleşmesindeki aynı fonksiyonu geçersiz kılmaktadır ve fonksiyonun içeriği değiştirilmiştir.

Kalıtım sırasının önemi

Solidity dilinde kalıtım sırası önemlidir. Ebeveyn sözleşmelerin sırası, çocuk sözleşmenin kalıtım aldığı fonksiyonların işlem sırasını belirler. Ebeveyn sözleşmeler, “en temel benzer”den “en türetilmişe” doğru sıralanmalıdır.

Örnek olarak, iki ebeveyn sözleşmesi olsun: ParentContract1 ve ParentContract2. ChildContract sözleşmesi bu iki sözleşmeden kalıtım alsın. Eğer ChildContract sözleşmesi ParentContract1 den önce ParentContract2 den kalıtım alırsa, o zaman ParentContract1‘deki fonksiyonlar ParentContract2‘deki fonksiyonların üzerine yazılır veya geçersiz kılınır. Eğer ChildContract sözleşmesi ParentContract2 den önce ParentContract1 den kalıtım alırsa, o zaman ParentContract2‘deki fonksiyonlar ParentContract1‘deki fonksiyonların üzerine yazılır veya geçersiz kılınır.

Örnek kod:

contract ParentContract1 {
  function parentFunction1() virtual public pure {}
}

contract ParentContract2 {
  function parentFunction1() virtual public pure {}
}

contract ChildContract is ParentContract2, ParentContract1 {
  // ...
}

Bu örnekte, ChildContract sözleşmesi ParentContract2‘den önce ParentContract1‘den kalıtım almıştır, bu nedenle ParentContract2‘deki parentFunction1 fonksiyonu ParentContract1‘deki fonksiyonun üzerine yazılır veya geçersiz kılınır.

İşlem Sırası ve Sözleşmelerin Listelenmesi

Solidity dilinde, ebeveyn sözleşmelerin sırası çocuk sözleşmedeki fonksiyonların işlem sırasını belirler. Bu nedenle, ebeveyn sözleşmelerin “en taban benzer” olandan “en türetilmiş” olan sıraya göre listelenmesi gereklidir.

Örnek olarak, iki ebeveyn sözleşmesi olsun: ParentContract1 ve ParentContract2. ChildContract sözleşmesi bu iki sözleşmeden kalıtım alsın. Eğer ChildContract sözleşmesi ParentContract1 den önce ParentContract2 den kalıtım alırsa, o zaman ParentContract1‘deki fonksiyonlar ParentContract2‘deki fonksiyonların üzerine yazılır veya geçersiz kılınır. Eğer ChildContract sözleşmesi ParentContract2 den önce ParentContract1 den kalıtım alırsa, o zaman ParentContract2‘deki fonksiyonlar ParentContract1‘deki fonksiyonların üzerine yazılır veya geçersiz kılınır.

Örnek kod:

contract ParentContract1 {
  function parentFunction1() virtual public pure {}
}

contract ParentContract2 {
  function parentFunction1() virtual public pure {}
}

contract ChildContract is ParentContract2, ParentContract1 {
  // ...
}

Bu örnekte, ChildContract sözleşmesi ParentContract2‘den önce ParentContract1‘den kalıtım almıştır, bu nedenle ParentContract2‘deki parentFunction1 fonksiyonu ParentContract1‘deki fonksiyonun üzerine yazılır veya geçersiz kılınır.

Örnek Akıllı Sözleşme İncelemesi

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

/* Graph of inheritance
    A
   / \
  B   C
 / \ /
F  D,E

*/

contract A {
    function foo() public pure virtual returns (string memory) {
        return "A";
    }
}

// Contracts inherit other contracts by using the keyword 'is'.
contract B is A {
    // Override A.foo()
    function foo() public pure virtual override returns (string memory) {
        return "B";
    }
}

contract C is A {
    // Override A.foo()
    function foo() public pure virtual override returns (string memory) {
        return "C";
    }
}

// Contracts can inherit from multiple parent contracts.
// When a function is called that is defined multiple times in
// different contracts, parent contracts are searched from
// right to left, and in depth-first manner.

contract D is B, C {
    // D.foo() returns "C"
    // since C is the right most parent contract with function foo()
    function foo() public pure override(B, C) returns (string memory) {
        return super.foo();
    }
}

contract E is C, B {
    // E.foo() returns "B"
    // since B is the right most parent contract with function foo()
    function foo() public pure override(C, B) returns (string memory) {
        return super.foo();
    }
}

// Inheritance must be ordered from “most base-like” to “most derived”.
// Swapping the order of A and B will throw a compilation error.
contract F is A, B {
    function foo() public pure override(A, B) returns (string memory) {
        return super.foo();
    }
}

Bu akıllı sözleşmede, A, B, C, D, E ve F adında 6 farklı sözleşme tanımlanmıştır.

Sözleşmeler arasındaki kalıtım ilişkisi aşağıdaki grafikte gösterilmiştir:

    A
   / \
  B   C
 / \ /
F  D,E

A sözleşmesi “foo” adında bir virütelleştirilmiş fonksiyon tanımlar. B ve C sözleşmeleri, A sözleşmesinden kalıtım alır ve “foo” fonksiyonunu geçersiz kılmak için “override” anahtar kelimesini kullanırlar.

D ve E sözleşmeleri birden fazla ebeveyn sözleşmeden kalıtım alabilirler. D sözleşmesinde “foo” fonksiyonunu geçersiz kılmak için “override(B, C)” kullanılır ve E sözleşmesinde “override(C, B)” kullanılır. Bu, çağırılan fonksiyonun ebeveyn sözleşmeler içinde hangi sıradaki tanımını kullanması gerektiğini belirler.

F sözleşmesi A ve B sözleşmelerinden kalıtım alır ve “foo” fonksiyonunu geçersiz kılmak için “override(A, B)” kullanılır. Sözleşmeler arasındaki kalıtım sırası, “taban benzeri” olandan “derlenmiş” olan şeklinde sıralanmalıdır, yoksa derleme hatası oluşacaktır.

Sonuç Bağlamı

Solidity dilinde inheritance, bir sözleşmenin başka bir sözleşmeden kalıtım almasını sağlar. “is” anahtar kelimesi kullanılarak sözleşmeler arasında kalıtım yapılabilir. Ebeveyn sözleşmedeki fonksiyonların çocuk sözleşme tarafından geçersiz kılınması için virtual olarak tanımlanması gerekir. Çocuk sözleşmedeki fonksiyonların ebeveyn fonksiyonları geçersiz kılması için override anahtar kelimesi kullanılmalıdır. Kalıtım sırası önemlidir ve ebeveyn sözleşmeler en “taban benzeri” olandan en “derlenmiş” olan sıraya göre listelenmelidir. Bu örnekte görüldüğü gibi, fonksiyonlar birden fazla sözleşmede tanımlanmışsa, sözleşmeler sağdan sola ve derinlik-öncelik yöntemiyle aranır. Sonuç olarak, inheritance Solidity dilinde sözleşmeler arasında yapısal ve kod tekrarını azaltan kalıtım yapmayı sağlar.

Solidity Programlama Dili Öğrenme yolculuğunuz hakkında daha iyi rehberlik almak için Solidity nedir? Ethereum Akıllı Sözleşmelerinin Dili Rehberi içeriğimize göz atın. Dilerseniz Yeni Başlayanlar için Solidity – Akıllı Sözleşme Geliştirme Hızlandırılmış Kursuna katılın.

Çalışmaya nereden başlayacağım diyenler için Blockchain ​​Developer Olmak İçin Yol Haritası içeriğine de muhakkak bakın.

Gelin aklınızdaki soruları SUPERPEER sohbetinde cevaplayalım.

Bu makaleyi okuduğunuz için teşekkürler! Bana destek olmak isterseniz;

Beni TwitterLinkedin ve YouTube‘da takip edin.

Kısa bir yorum bırakmayı UNUTMAYIN!

solidity101 - Solidity, 2015 yılında Christian Reitwiessner liderliğinde piyasaya sürülen, büyük harf kullanımına göre ikinci en büyük kripto para piyasası olan Ethereum tarafından oluşturulan yepyeni bir programlama dilidir.

Yazarın Profili
İlginizi Çekebilir

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir