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 Twitter, Linkedin ve YouTube‘da takip edin.
Kısa bir yorum bırakmayı UNUTMAYIN!