Kongyi College: 国内ブロックチェーン職業教育のトップブランド
著者: Li Yuechun、ブロックチェーンおよび高可用性アーキテクチャ エンジニア
WeChat: liyc1215 QQ グループ: 348924182 ブログ: http://liyuechun.org
前のセクションで関数パラメータでこのキーワードを使用した場合storage
、現在の関数の型はinternal
またはでなければなりませんprivate
。
このセクションでは、私 (WeChat: liyc1215) が属性と関数の使用許可を中心に紹介します。
状態変数と関数の権限
1.公共
注:デモンストレーションの便宜上、https://remix.ethereum.org/
直接デモンストレーションします。
public
型状態変数と関数には最大の権限があり、外部、サブコントラクト、およびコントラクト内からアクセスできます。
pragma solidity ^0.4.4;
contract Animal {
string _birthDay; // 生日
int public _age; // 年龄
int internal _weight; // 身高
string private _name; // 姓名
function Animal() {
_age = 29;
_weight = 170;
_name = "Lucky dog";
_birthDay = "2011-01-01";
}
function birthDay() constant returns (string) {
return _birthDay;
}
function age() constant public returns (int) {
return _age;
}
function height() constant internal returns (int) {
return _weight;
}
function name() constant private returns (string) {
return _name;
}
}
この契約では、実行結果から、外部から呼び出すことができる関数が 、 の 3 つであることが簡単birthDay
にわかります。関数の呼び出しに関しては、その理由は、状態変数の権限がtypeの場合、外部から呼び出すことができる関数を自動的に生成するためです。私たちのコントラクトでは、これは型であるため、実際には、以下に示すように、コントラクト内の状態変数と同じ名前のデフォルトのものが存在します。_age
age
_age
_age
_age
_age
public
public
get
_age
public
get函数
function _age() constant public returns (int) {
return _age;
}
4 つの関数のうち、明示的に宣言します。
function birthDay() constant returns (string) {
return _birthDay;
}
function age() constant public returns (int) {
return _age;
}
function height() constant internal returns (int) {
return _weight;
}
function name() constant private returns (string) {
return _name;
}
上記の実行結果から、これら 4 つの関数のうち、外部からアクセスできるのは関数birthDay
と関数だけであることがわかります。 [追記:この関数は私が明示的に宣言しています。状態変数はデフォルトで の型であるため、関数は自動的に生成されます。 . したがって、外部からアクセスできる状態変数と同名の関数は自動生成されません] . つまり、その型の関数のみが外部からアクセス可能であることがわかります。関数は宣言されており、デフォルトはtype であり、状態変数は宣言されており、デフォルトはtypeです。age
age
_age
_age
public
internal
public
public
internal
まとめ:
- 状態変数が宣言されると、デフォルトは
internal
型になります。明示的に型として宣言された状態変数のみ、現在の状態変数の値を外部から取得するためにpublic
状態変数と同じ名前の関数が自動的に生成されます。get
- 関数が宣言されると、その関数はデフォルトで
public
型になり、public
明示的に型として宣言された関数と同様に外部からアクセスできます。
二、internal
internal
型状態変数は、外部およびサブコントラクトの呼び出しに使用できます。internal
型関数private
は型関数と同じです。スマート コントラクトは内部でそれらを呼び出します。protected
他の言語の関数とまったく同じではありません。
pragma solidity ^0.4.4;
contract Animal {
string _birthDay; // 生日
int public _age; // 年龄
int internal _weight; // 身高
string private _name; // 姓名
function Animal() {
_age = 29;
_weight = 170;
_name = "Lucky dog";
_birthDay = "2011-01-01";
}
function birthDay() constant returns (string) {
return _birthDay;
}
function age() constant public returns (int) {
return _age;
}
function height() constant internal returns (int) {
return _weight;
}
function name() constant private returns (string) {
return _name;
}
}
contract Person is Animal {
function Person() {
_age = 50;
_weight = 270;
_birthDay = "2017-01-01";
}
}
この場合、contract Person is Animal
コントラクトはコントラクトのすべての状態変数Person
を継承しますが、継承できるのは、親コントラクト内のすべてのタイプの関数、継承できない関数、継承できない関数、および継承できない関数のみです。Animal
public/internal
public
internal/private
internal/private
internal/private
3.プライベート
コントラクト内で状態変数をperson
呼び出そうとすると、コンパイルが成功しないことがわかります。_name
_name
状態変数はAnimal
コントラクト内のprivate
プライベート型であり、内部でのみ使用できるためAnimal
、サブコントラクトで状態変数を使用しようとするとエラーが報告されますPerson
。
4.書き換える
子コントラクトは、親コントラクトのpublic
型の関数を継承できますが、パブリック型の関数のみを継承できます。継承した関数を直接呼び出すこともできます。もちろん、継承した関数を書き換えることもできます。
- 書き換え前
pragma solidity ^0.4.4;
contract Animal {
string _birthDay; // 生日
int public _age; // 年龄
int internal _weight; // 身高
string private _name; // 姓名
function Animal() {
_age = 29;
_weight = 170;
_name = "Lucky dog";
_birthDay = "2011-01-01";
}
function birthDay() constant returns (string) {
return _birthDay;
}
function age() constant public returns (int) {
return _age;
}
function height() constant internal returns (int) {
return _weight;
}
function name() constant private returns (string) {
return _name;
}
}
contract Person is Animal {
}
- 書き換え後
pragma solidity ^0.4.4;
contract Animal {
string _birthDay; // 生日
int public _age; // 年龄
int internal _weight; // 身高
string private _name; // 姓名
function Animal() {
_age = 29;
_weight = 170;
_name = "Lucky dog";
_birthDay = "2011-01-01";
}
function birthDay() constant returns (string) {
return _birthDay;
}
function age() constant public returns (int) {
return _age;
}
function height() constant internal returns (int) {
return _weight;
}
function name() constant private returns (string) {
return _name;
}
}
contract Person is Animal {
function birthDay() constant returns (string) {
return "2020-12-15";
}
}
まとめ
public、internal、private
この記事では、コントラクトの内部、外部、およびサブコントラクトにおけるコントラクトの状態変数と関数における 3 つのアクセス許可の適用を主に包括的に紹介します。このチュートリアルを学ぶことで、状態変数の継承と関数の継承と書き換えについてさらに詳しく学べると思います。次回の連載では、Solidityの関連構文や開発時の注意点についてさらに詳しく解説していきます。
技術交流
ブロックチェーン技術取引所QQグループ:348924182
「Blockchain Tribe」公式公開アカウント