Kongyi College : une marque leader dans l'enseignement professionnel blockchain national
Auteur : Li Yuechun, ingénieur en architecture blockchain et haute disponibilité
WeChat : liyc1215 Groupe QQ : 348924182 Blog : http://liyuechun.org
Lorsque nous avons utilisé ce mot-clé dans un paramètre de fonction dans la section précédente storage
, la fonction actuelle doit être de type internal
ou private
.
Dans cette section, je (WeChat : liyc1215) me concentrerai sur l'introduction des autorisations d'utilisation des attributs et des fonctions .
Autorisations des variables d'état et des fonctions
1. publique
Remarque : Pour faciliter la démonstration, je https://remix.ethereum.org/
vais faire une démonstration directement.
public
Les variables et fonctions d'état de type disposent des autorisations les plus élevées et sont accessibles en externe, en sous-traitance et au sein du contrat.
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;
}
}
Dans ce contrat, nous pouvons facilement voir à partir des résultats d'exécution qu'il existe trois fonctions qui peuvent être appelées de manière externe, à savoir , birthDay
. _age
Certaines age
personnes peuvent se demander : pourquoi les fonctions externes peuvent-elles être appelées _age
? Pourquoi les fonctions externes peuvent-elles être appelées ? Pourquoi les fonctions externes peuvent-elles être appelées _age
? être appelé ? Quant à l'appel de _age
fonctions,_age
la raison en est que les autorisations de nos variables d'état sont que public
lorsque les autorisations d'une variable d'état sont de type, elle générera automatiquement une fonction public
qui peut être appelée en externe . get
Dans notre contrat, comme _age
il s'agit public
d'un type, il en existe un par défaut portant le même nom que la variable d'état dans le contrat get函数
, comme indiqué ci-dessous :
function _age() constant public returns (int) {
return _age;
}
Parmi les quatre fonctions nous déclarons explicitement :
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;
}
D'après les résultats d'exécution ci-dessus, nous savons que parmi ces quatre fonctions, seules la fonction birthDay
et age
la fonction sont accessibles en externe. [PS : age
La fonction est explicitement déclarée par moi. _age
La fonction est générée _age
automatiquement public
car la variable d'état est de internal
type par défaut . Par conséquent, une fonction du même nom que la variable d'état accessible de l'extérieur ne sera pas automatiquement générée.] . En d'autres termes, seule public
la fonction du type est accessible de l'extérieur. On voit que lorsque la fonction est déclarée, la valeur par défaut est public
le type et la variable d'état est déclarée, la valeur par défaut est internal
type .
résumé:
- Lorsqu'une variable d'état est déclarée, elle est par défaut de
internal
type. Seulespublic
les variables d'état explicitement déclarées comme type généreront automatiquement une fonction du même nom que la variable d'étatget
pour l'acquisition externe de la valeur de la variable d'état actuelle. - Lorsqu'une fonction est déclarée, elle est par défaut
public
un type etpublic
est accessible de l'extérieur tout comme une fonction explicitement déclarée comme type.
2. interne
internal
Les variables d'état de type sont disponibles pour les appels externes et en sous-traitance .internal
Les fonctions de type sont identiques auxprivate
fonctions de type. Les contrats intelligents les appellent en interne. Ellesprotected
ne sont pas exactement les mêmes que celles des autres langages.
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";
}
}
Dans ce cas, contract Person is Animal
le Person
contrat hérite de toutes les variables d'état Animal
du contrat public/internal
, mais ne peut hériter que de tous public
les types de fonctions du contrat parent, des fonctions qui ne peuvent pas être héritées internal/private
, des fonctions qui ne peuvent pas être héritées et des fonctions internal/private
qui ne peuvent pas être héritées .internal/private
3. privé
Lorsque nous person
essayons d'appeler _name
des variables d'état dans le contrat, vous constaterez que la compilation ne peut pas réussir.
Étant donné que _name
les variables d'état sont de type privé dans Animal
le contrat et ne peuvent être utilisées qu'en interne, une erreur sera signalée lorsque nous tenterons de les utiliser dans le sous-contrat .private
Animal
Person
4. Réécrire
Un contrat enfant peut hériter de fonctions du type du contrat parent et ne peut hériter que de fonctions de type public. Nous pouvons appeler directement les fonctions héritées. Bien sûr, nous pouvons également réécrire les fonctions héritées.public
- Avant de réécrire
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 {
}
- Après réécriture
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";
}
}
résumé
Cet article présente principalement de manière exhaustive public、internal、private
l'application des trois autorisations dans les variables d'état du contrat et les fonctions dans les contrats internes, externes et de sous-traitance du contrat. En étudiant ce tutoriel, je pense que vous en apprendrez davantage sur l'héritage des variables d'état et l'héritage et la réécriture des fonctions . Dans la prochaine série d'articles, nous enseignerons plus en détail la syntaxe pertinente dans Solidity et les précautions lors du développement.
Échange technologique
Groupe QQ d'échange de technologie Blockchain : 348924182
Compte public officiel de "Blockchain Tribe"