1. Anasayfa
  2. 100 Günde Solidity

🧵 #100GündeSolidity 026 : Üst Sözleşmeleri Çağırma

🧵 #100GündeSolidity 026 : Üst Sözleşmeleri Çağırma
Üst Sözleşmeleri Çağırma
0

Üst Sözleşmeleri Çağırma – Parent Sözleşmelere Erişmek: ‘Calling Parent Contracts’

Merhaba, #100DaysOfSolidity e-bültenimize hoş geldiniz. Bugünkü konumuz “Calling Parent Contracts“. Solidity dilinde, bir sözleşmenin, birden fazla sözleşmeye dayanması yaygın bir durumdur. Bu durumda, “Inheritance” konusunda da bahsettiğimiz gibi, bir sözleşme, başka bir sözleşmeye dayanır ve bu şekilde aynı kodların tekrar tekrar yazılması engellenir.

Ancak, bir sözleşmenin üstteki bir sözleşmeye dayanması durumunda, üstteki sözleşmenin fonksiyonlarına nasıl erişebiliriz? İşte bu noktada, “Calling Parent Contracts” konusu devreye girer. Bu konuda, üstteki sözleşmenin fonksiyonlarına doğrudan erişim sağlama ve “super” anahtar kelimesini kullanarak tüm doğrudan üstteki sözleşmelerin fonksiyonlarını çağırma yöntemlerini öğreneceğiz.

Hazırsanız, başlayalım!

Solidity dilinde, bir sözleşme başka bir sözleşmeye dayanıyorsa (inheritance), üstteki sözleşmeye ait fonksiyonlara doğrudan erişebiliriz. Ayrıca, “super” anahtar kelimesini kullanarak doğrudan üstteki tüm sözleşmelerin fonksiyonlarını çağırabiliriz. Bu yöntemler hakkında daha fazla bilgi edinelim.

Doğrudan Erişim

Bir sözleşmenin, bir üstteki sözleşmeye dayandığı durumlarda, üstteki sözleşmenin fonksiyonlarına doğrudan erişebiliriz. Bunun için, üstteki sözleşmenin adını belirterek, nokta (.) operatörü ile erişebiliriz. Örnek olarak şu kod parçasına bakalım:

pragma solidity ^0.8.0;

contract ParentContract {
    function parentFunction() public pure returns (string memory) {
        return "This is the parent function.";
    }
}

contract ChildContract is ParentContract {
    function childFunction() public pure returns (string memory) {
        string memory result = parentFunction();
        return result;
    }
}

Bu kod parçasında, ChildContract isimli sözleşme, ParentContract isimli sözleşmeye dayanmaktadır. ChildContract isimli sözleşmenin childFunction() fonksiyonunda, parentFunction() fonksiyonunu çağırmak için parentFunction() fonksiyonunun adını kullanıyoruz.

super Anahtar Kelimesi ile Erişim

Solidity dilinde, “super” anahtar kelimesini kullanarak doğrudan üstteki tüm sözleşmelerin fonksiyonlarını çağırabiliriz. Bu yöntemle, bir sözleşmenin doğrudan üstteki sözleşmelerinde tanımlanmış bir fonksiyonu çağırabiliriz. Örnek olarak şu kod parçasına bakalım:

pragma solidity ^0.8.0;

contract ParentContract {
    function parentFunction() public pure virtual returns (string memory) {
        return "This is the parent function.";
    }
}

contract ChildContract is ParentContract {
    function parentFunction() public pure virtual override returns (string memory) {
        return "This is the child function, but it calls the parent function using super.";
    }

    function childFunction() public pure returns (string memory) {
        string memory result = super.parentFunction();
        return result;
    }
}

Bu kod parçasında, ChildContract isimli sözleşme, ParentContract isimli sözleşmeye dayanmaktadır. ParentContract isimli sözleşmede parentFunction() fonksiyonu tanımlanmıştır. ChildContract isimli sözleşmede de parentFunction() fonksiyonu tanımlanmıştır ve override edilmiştir.

Virtual Fonksiyonlar

Parent sözleşmedeki fonksiyonlar “virtual” olarak tanımlandığında, child sözleşmelerinde “override” edilebilir. Bu, child sözleşmesinin, parent sözleşmede tanımlanan aynı isimdeki bir fonksiyonu override edebileceği anlamına gelir. Bu şekilde, parent sözleşmesinde tanımlanan fonksiyonlar child sözleşmesinde değiştirilebilir ve child sözleşmesine özel bir işlevsellik kazandırılabilir.

Modifierlar ve Parent Contracts

Modifierlar, parent sözleşmedeki fonksiyonlara da uygulanabilir. Bunun için, parent sözleşmedeki fonksiyonlara uygulamak istediğimiz modifier’ın “virtual” olarak tanımlanması ve child sözleşmesinde uygulanması gerekiyor. Örnek olarak şu kod parçasına bakalım:

pragma solidity ^0.8.0;

contract ParentContract {
    address owner;

    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Only owner can call this function.");
        _;
    }

    function parentFunction() public onlyOwner pure virtual returns (string memory) {
        return "This is the parent function.";
    }
}

contract ChildContract is ParentContract {
    function childFunction() public onlyOwner pure returns (string memory) {
        string memory result = super.parentFunction();
        return result;
    }
}

Bu örnekte, ParentContract isimli sözleşme, “onlyOwner” adında bir modifier ve “parentFunction” adında bir fonksiyon içermektedir. ChildContract isimli sözleşme, ParentContract isimli sözleşmeye dayanmaktadır. ChildContract isimli sözleşmenin childFunction() fonksiyonu, sadece owner tarafından çağrılabilen parentFunction() fonksiyonunu çağırmaktadır.

Shadowing Inherited State Variables

Parent sözleşmedeki state değişkenleri, child sözleşmelerinde aynı isimde bir state değişkeni tanımlandığında, “shadowing” oluşabilir. Bu durumda, child sözleşme, kendi tanımladığı state değişkenini kullanır. Parent sözleşmenin state değişkeni, child sözleşmenin state değişkeninden farklı bir değere sahip olabilir. Örnek olarak şu kod parçasına bakalım:

pragma solidity ^0.8.0;

contract ParentContract {
    string public name = "Parent";

    function parentFunction() public pure returns (string memory) {
        return "This is the parent function.";
    }
}

contract ChildContract is ParentContract {
    string public name = "Child";

    function childFunction() public view returns (string memory) {
        return name;
    }

    function parentFunction() public pure override returns (string memory) {
        return "This is the child function, but it calls the parent function using super.";
    }
}

Bu örnekte, ParentContract isimli sözleşmenin “name” adında bir public state değişkeni ve “parentFunction” adında bir fonksiyonu bulunmaktadır. ChildContract isimli sözleşme, ParentContract isimli sözleşmeye dayanmaktadır ve “name” adında bir public state değişkeni ve “childFunction” adında bir fonksiyonu bulunmaktadır.

ChildContract isimli sözleşmede “name” adında bir public state değişkeni tanımlandığı için, ParentContract isimli sözleşmedeki “name” public state değişkeni “shadowing” olmuştur. Bu durumda, ChildContract isimli sözleşmedeki “name” public state değişkeni kullanılır.

Ayrıca, ChildContract isimli sözleşmede “parentFunction” adında bir fonksiyon tanımlanmıştır ve “override” edilmiştir. Bu durumda, ParentContract isimli sözleşmedeki “parentFunction” fonksiyonu, ChildContract isimli sözleşmedeki “parentFunction” fonksiyonu ile değiştirilmiştir. Child sözleşmesinde tanımlanan fonksiyon, parent sözleşmesindeki fonksiyona üstünlük sağlamaktadır. Ancak, child sözleşmesinde, “super” anahtar kelimesi kullanılarak parent sözleşmedeki fonksiyon çağrılabilir.

Akıllı Sözleşme Örneği İnceleme

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

/* Inheritance tree
   A
 /  \
B   C
 \ /
  D
*/

contract A {
    // This is called an event. You can emit events from your function
    // and they are logged into the transaction log.
    // In our case, this will be useful for tracing function calls.
    event Log(string message);

    function foo() public virtual {
        emit Log("A.foo called");
    }

    function bar() public virtual {
        emit Log("A.bar called");
    }
}

contract B is A {
    function foo() public virtual override {
        emit Log("B.foo called");
        A.foo();
    }

    function bar() public virtual override {
        emit Log("B.bar called");
        super.bar();
    }
}

contract C is A {
    function foo() public virtual override {
        emit Log("C.foo called");
        A.foo();
    }

    function bar() public virtual override {
        emit Log("C.bar called");
        super.bar();
    }
}

contract D is B, C {
    // Try:
    // - Call D.foo and check the transaction logs.
    //   Although D inherits A, B and C, it only called C and then A.
    // - Call D.bar and check the transaction logs
    //   D called C, then B, and finally A.
    //   Although super was called twice (by B and C) it only called A once.

    function foo() public override(B, C) {
        super.foo();
    }

    function bar() public override(B, C) {
        super.bar();
    }
}

Bu akıllı sözleşme örneği, kalıtım yapısı kullanılarak Parent Sözleşmesi A ve ondan türetilen Child Sözleşmeleri B ve C arasındaki ilişkiyi ve bu iki sözleşmenin bir arada kullanımını göstermektedir. Ayrıca, D isimli bir sonraki sözleşme, hem B hem de C’den miras almaktadır.

A Sözleşmesi, “foo” ve “bar” adında iki fonksiyon içermektedir. Her iki fonksiyon da “emit Log” komutu kullanarak loglama yapmaktadır. “foo” fonksiyonu “virtual” olarak tanımlanmıştır. Bu, alt sınıfların bu fonksiyonu “override” edebileceği anlamına gelir. “bar” fonksiyonu da aynı şekilde tanımlanmıştır.

B Sözleşmesi, A Sözleşmesinden kalıtım yoluyla türetilmiştir ve “foo” ve “bar” fonksiyonlarını “override” etmiştir. “foo” fonksiyonu, A Sözleşmesindeki fonksiyonu çağırdıktan sonra kendi loglama mesajını gönderir. “bar” fonksiyonu ise, önce kendi loglama mesajını gönderir ve ardından “super.bar()” kullanarak A Sözleşmesindeki “bar” fonksiyonunu çağırır.

C Sözleşmesi, A Sözleşmesinden kalıtım yoluyla türetilmiştir ve B Sözleşmesiyle aynı şekilde “foo” ve “bar” fonksiyonlarını “override” etmiştir. “foo” fonksiyonu, A Sözleşmesindeki fonksiyonu çağırdıktan sonra kendi loglama mesajını gönderir. “bar” fonksiyonu ise, önce kendi loglama mesajını gönderir ve ardından “super.bar()” kullanarak A Sözleşmesindeki “bar” fonksiyonunu çağırır.

D Sözleşmesi, hem B hem de C Sözleşmelerinden kalıtım yoluyla türetilmiştir ve “foo” ve “bar” fonksiyonlarını “override” etmiştir. “foo” fonksiyonu, “B.foo()” fonksiyonunu çağırırken “C.foo()” fonksiyonunu çağırmadan önce A Sözleşmesindeki fonksiyonu çağırır. “bar” fonksiyonu, önce “C.bar()” fonksiyonunu, sonra “B.bar()” fonksiyonunu ve son olarak “A.bar()” fonksiyonunu çağırmaktadır. “B.bar()” fonksiyonu, “super.bar()” kullanarak A Sözleşmesindeki “bar” fonksiyonunu çağırdığından, “D.bar()” fonksiyonu çağrıldığında “

super” iki kez çağrılmış olsa da A Sözleşmesindeki “bar” fonksiyonu yalnızca bir kez çağrılır.

Bu örnekte, Parent Sözleşmelerinin fonksiyonları, “super” anahtar kelimesi kullanılarak doğrudan çağrılabilir. Bu, kodun okunmasını ve bakımını kolaylaştırır ve hata ayıklama sürecinde faydalıdır. Ancak, Parent Sözleşmelerindeki fonksiyonlar doğrudan çağrılmak yerine “super” anahtar kelimesi kullanılarak çağrılırsa, gelecekteki değişikliklere karşı daha esnek bir yapı oluşturulabilir.

Özetle, “Calling Parent Contracts” konusu, kalıtım yoluyla türetilen Sözleşmelerin üstündeki Sözleşmelerin fonksiyonlarının nasıl çağrılabileceğini açıklar. “super” anahtar kelimesi kullanarak Parent Sözleşmelerindeki fonksiyonlara doğrudan erişmek, kodun okunmasını ve bakımını kolaylaştırır ve gelecekteki değişikliklere karşı daha esnek bir yapı oluşturur.

Sonuç Bağlamı

Solidity programlama dili, Sözleşme geliştirmek için birçok araç sunar ve kalıtım, bu araçlardan biridir. Kalıtım, Sözleşme kodunun yeniden kullanılmasını sağlar ve kodun daha düzenli ve sürdürülebilir hale gelmesine yardımcı olur. “Calling Parent Contracts” konusu, kalıtım yoluyla türetilen Sözleşmelerde, Parent Sözleşmelerinin fonksiyonlarının nasıl çağrılabileceğini açıklar. “super” anahtar kelimesi kullanarak Parent Sözleşmelerindeki fonksiyonlara doğrudan erişmek, kodun okunmasını ve bakımını kolaylaştırır ve gelecekteki değişikliklere karşı daha esnek bir yapı oluşturur.

Solidity programlama dilinin kalıtım yapısını ve Parent Sözleşmelerine nasıl erişileceğini anlamak, geliştiricilerin daha etkili ve verimli Sözleşmeler oluşturmasına yardımcı olur. Bu konuda edinilen bilgiler, daha büyük ve karmaşık projelerde özellikle yararlıdır.

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