オブジェクト指向プログラミングの三つの特徴 - 継承
なぜ継承:
小さな問題は、コードの再利用の質問をし、生徒のテストプログラムextends01.goのシステムを参照してください。
コード:
パッケージのメイン
インポート(
「FMT」
)
//学生の試験制度を書きます
//小学生
タイプ瞳のstruct {
名前の文字列の
年齢のint型
スコアのint
}
//彼の結果を表示
FUNC(p型*瞳孔)SHOWINFO(){
fmt.Printf(、p.Name "学生名=体積%=%のVスコア=容量%の\ nの年齢" 、p.Age、p.Score)
}
FUNC(P *瞳孔)SetScoure(スコアはint){
{100 <0 ||スコア>スコアIF
fmt.Println( "あなたが入力が間違っグレードである")
}
p.Scoreスコア=
}
FUNC(P *瞳孔)試験(){
( "一次検査は...")fmt.Println
}
//大学生
型大学院のstruct {
名前の文字列の
年齢のint型
スコアのint
}
//彼の結果を表示
FUNC(p型*大学院)SHOWINFO(){
fmt.Printf(、p.Name "学生名=体積%=%のVスコア=容量%の\ nの年齢" 、p.Age、p.Score)
}
FUNC(P *大学院)SetScoure(スコアはint){
{100 <0 ||スコア>スコアIF
fmt.Println( "あなたが入力が間違っグレードである")
}
p.Scoreスコア=
}
FUNC(P-*大学院)テスト(){
fmt.Println( "に...テストを受け大学生")
}
//コードの冗長性...高校....
FUNCのメイン(){
VAR瞳=&瞳孔{
名: "トム"、
年齢:10、
}
pupil.testing()
pupil.SetScoure(90)
pupil.ShowInfo()
VAR graudate =&大学院{
名: "メリー"、
年齢:20、
}
graudate.testing()
graudate.SetScoure(80)
graudate.ShowInfo()
}
上記のコードの概要:
1)フィールドとメソッド生徒と大学院2つの構造がほぼ同じですが、我々は、コードの再利用性が強くない、ほとんど同一の重複したコードを書きました。
2)冗長コードを表示し、拡張機能を助長しないがコードは、メンテナンスに資するものです。
3)溶液 - 継承することによって解決すること
基本的な導入と継承図:
人間の心に私たちのプログラムは近いように継承は、コードの再利用を解決することができます。
同じ構造の属性(フィールド)、及び複数の方法が存在する場合、構造は、これらの構造(例えばちょうど学生など)、この構造で定義されたこれらの同じプロパティとメソッドから抽出することができます。
これらの属性(フィールド)とメソッド、学生匿名への唯一の入れ子構造を再定義することなく、他の構造。
イラスト:
言い換えれば、別の匿名の構造、構造体、ネストされた場合Golangに、この構造は、直接継承機能を有効にする、匿名の構造体のフィールドやメソッドにアクセスすることができます。
基本的な構文の匿名入れ子構造:
グッズ構造体を入力し、{
名前文字列
価格はint
}
構造体{ブック型
製品//これは入れ子構造匿名グッズで
ライターの文字列
}
はじめに:
我々の改善extends01.go、継承機能を実装するために、ネストされた構造を使用する匿名の方法は、このプログラムの利点を理解するために注意を払ってください。
コードの実装:
パッケージのメイン
インポート(
「FMT」
)
//学生の試験制度を書きます
タイプの学生のstruct {
名前の文字列の
年齢のint型
スコアのint
}
//瞳孔と大学院の一般的な方法は、学生*にバインドされ
FUNC(STU *学生)SHOWINFO(){
fmt.Printf( "学生名=体積%=%のVスコア=容量%の\ nの年齢"、stu.Name 、stu.Age、stu.Score)
}
FUNC(STU *学生)SetScore(スコアはint){
スコア<0 ||スコア>のIF {100
fmt.Printlnは、( "間違ったグレードで入力された")
}
=スコアをstu.Score
}
// *学生方法に増加し、その後瞳孔科は、この方法を使用することができ
FUNC(STU *スチューデント)GetSum(N1、N2 INTをINTは){int型
N1 + N2を返します
}
//プライマリ
タイプstruct {瞳孔
生徒
}
//これは、ユニークな方法瞳構造、保持され
FUNCは、(P *瞳孔)テスト(){
fmt.Printlnは( "主な検査はあります...")
}
//学生
型構造体の{科
生徒
}
//これは、保持する大学院構造のユニークな方法であり、
FUNC(p型*大学院)テスト(){
fmt.Println(「で...テストを受け大学生を」)
}
FUNCのメイン(){
//私たちのチームの構造は、あなたの構造に組み込まれた場合には、使用方法が異なります。
瞳:= {}&瞳孔
pupil.Student.Name = "トム〜"
pupil.Student.Age = 8。
pupil.testing()
pupil.Student.SetScore(70)
pupil.Student.ShowInfo()
fmt.Println(「RES = 」pupil.Student.GetSum(1,2))
大学院:=&大学院{}
graduate.Student.Name = "メアリー"
graduate.Student.Age = 20
graduate.testing()
graduate.Student.SetScore(90)
graduate.Student.ShowInfo()
fmt.Println( "RES2 =" 、graduate.Student.GetSum(3,4))
}
継承の深さの議論:
1)構造は、すべてのフィールドと、すなわち、匿名の入れ子構造の方法を使用することができる:大文字と小文字のフィールドの最初の文字、方法を、使用することができます。
案例:
構造体を入力し、{
名前ストリング
年齢INT
}
FUNC(*はA)Sayok(){
fmt.Println( "A Sayok"、a.Name)
}
FUNC(*はA)ハロー(){
fmt.Println( "ハロー"、a.Name)
}
FUNC(* A)hello2(){
fmt.Println( "ハロー"、a.age)
}
タイプB構造体{
A
}
FUNCのメイン(){
B bはVAR
bAName = "トム"
bAage 19 =
bASayok()
bAhello()
bAhello2を()
}
2)匿名アクセスフィールド構造を簡素化することができます
ケース:
FUNCのメイン(){
VaRのB B
bAName = "トム"
bAage 19 =
bASayok()
bAhello()
bAhello2を()
//上記の表現を簡略化することができる
b.name = "スミス"
b.age = 20である
b.Sayok()
b.hello()
b.hello2()
}
上記のコードの概要:
我々は、直接フィールドまたはメソッドBを介してアクセスした場合、以下のように(1)、実装プロセスである:例えばb.nameについて
(2)コンパイラを見そうであれば、ダイレクトコールタイプB Nameフィールドを該当するタイプBの名前を持たないであろう
(あなたは見に行かない場合はお電話の場合は、エラーを見つけることができない場合は...見つけるために、継続しない場合3)匿名の構造Aに埋め込まれたBは、名前のフィールドを宣言していません。
3)構造と匿名構造体は、同じフィールドまたはメソッドを持っている場合、コンパイラは、そのようなアクセスフィールドと匿名所望の構造の方法として、最も近いアクセスを、アクセスの原則を使用し、匿名構造名で区別することができます。
案例:
構造体を入力し、{
名前ストリング
年齢INT
}
FUNC(*はA)Sayok(){
fmt.Println( "A Sayok"、a.Name)
}
FUNC(*はA)ハロー(){
fmt.Println( "ハロー"、a.Name)
}
FUNC(* A)hello2(){
fmt.Println( "ハロー"、a.age)
}
タイプB構造体{ Nameストリング}
FUNCのメイン(){
VAR B B
b.Name = "ジャック"
bAName = "soctt"
b.age = 100
b.Sayok()
b.hello()
}
アクセスするとき4)明示的に匿名を指定しなければならない、(またはそれ以上)の構造自体は、名前フィールドおよびメソッド同じではないながら、このような二匿名構造および方法匿名構造は、(同じフィールドを有する)は、2つの構造体中に埋め込まれ構造名またはコンパイラエラー。
ケース:
構造体を入力し、{
名前の文字列の
年齢はint
}
タイプB構造体{
名文字列
スコアのfloat64
}
タイプCのstruct { B }
メインFUNC(){
VARのCのC
// cは名前フィールドではなく、AとBは、その後、あなたが匿名の構造体の名前を指定する必要があり、名前フィールドを持っている場合
c.Nameはコンパイルエラーを報告しますので、//は、この方法は同じルールであります
//c.Name = "トム" //エラー
CANameの= "トム" // OK
fmt.Println(C)} // {{トム0} {0}
}
5)よく知られているのネストされた構造体構造の場合、このモデルは、組み合わせのアクセス内のフィールドやメソッドの構造は、名前の構造を持参しなければならない関係の組み合わせであれば、いつ、の組み合わせです。
ケース:
構造体を入力し、{
名前の文字列の
年齢はint
}
D {構造体タイプ
A //入れ子構造知ら
}
メインFUNC(){
Dは、よく知られた構造である場合は、//、アクセスフィールドの構造が知られているが、有名な構造名持参しなければなりません
//などdanameの
VAR DのDの
daname =「ジャック」
fmt.Println(Dを)
}
6)匿名入れ子構造の後、直接それぞれのフィールド匿名構造体の値を指定する、ときに構造体変数(例)を作成することができます。
ケース:
型製品の構造体{
名前の文字列
価格のfloat64
}
型ブランドのstruct {
名列
アドレス列
}
型テレビのstruct {
グッズ
ブランド
}
タイプTV2構造体{
*製品
*ブランド
}
メインFUNC(){
TV1:TV = {{製品"テレビ001"、5000}、{ブランド " ハイアール"、 "青島"}}
TV2:= {TV
製品{ "002 TV"、5000.99}
ブランド{ "シーメンス"、 "北京"}
}
TV3:= {テレビ
製品{
価格:4000、
名称: "テレビ003"
}、
ブランド{
名: "シャープ"
住所: "上海"、
}、
}
fmt.Println(TV1)
fmt.Println(TV2)
fmt.Println(TV3)
TV4:= TV2 {&グッズ{ " テレビ004"、7000}、&ブランド { " Skyworthは"、 "河南"}、}
TV5:= TV2 {
&グッズ{
名: "テレビ005"、
価格:6000、
}、
&ブランド{
名: "フィリップス"、
住所: "オランダ"、
}、
}
fmt.Println(tv4.Goods *、* tv4.Brand)
fmt.Println(tv5.Goods *、* tv5.Brand)
}