5.方法的繼承與重寫
結構體內的字段有可能也是乙個結構體,這樣的結構體稱為巢狀結構體。
package main
import
"fmt"
type animal struct
type dog struct
func
main()
,"上海"
} fmt.
printf
("d=%+v\n"
, d)
/*訪問嵌入式結構體內部成員,需要顯式呼叫*/
fmt.
printf
("name=%s,age=%d,color=%s,address=%s\n"
, d.animal.name, d.animal.age, d.animal.color, d.address)
var t dog
t.animal.name =
"旺財"
t.animal.age =
5 t.animal.color =
"白色"
t.address =
"北京"
fmt.
printf
("t=%+v\n"
, t)
}
如果結構體中的匿名欄位是結構體,那麼這個結構體所擁有的全部欄位都被隱式的引入了當前定義的這個結構體。這種結構體內部巢狀匿名結構體的組合稱作匿名組合。而匿名結構體中的成員可以通過外部結構體直接訪問。
package main
import
"fmt"
type animal struct
type dog struct
func
main()
,"上海"
} fmt.
printf
("d1=%+v\n"
, d1)
fmt.
printf
("name=%s,age=%d,color=%s,address=%s\n"
, d1.name, d1.age, d1.color, d1.address)
//部分初始化
d2 := dog
} fmt.
printf
("d2=%+v\n"
, d2)
var d3 dog
/*匿名字段內部成員直接呼叫*/
d3.name =
"旺財"
//等價於d3.animal.name="旺財"
d3.age =
5 d3.color =
"白色"
d3.address =
"北京"
fmt.
printf
("d3=%+v\n"
, d3)
}
外部結構體的成員變數名和嵌入的內部結構體成員變數名相同,則此外部結構體成員被稱作同名字段。同名字段,可以通過外部結構體直接訪問,但是內部結構體成員變數的訪問需要顯示呼叫。
package main
import
"fmt"
type animal struct
type dog struct
func
main()
匿名字段不僅可以是結構體型別,還可以是其他任意的內建型別和自定義型別,甚至可以是結構體的指標型別。
非結構體型別包括:所有的內建型別和自定義型別。
匿名字段逼近可以是結構體型別,也可以是結構體指標型別
package main
import
"fmt"
type animal struct
type mystr string
// 自定義型別
type dog struct
func
main()
,"上海"
,"二哈"
} d.mystr =
"旺財"
fmt.
printf
("d=%+v\n"
, d)
fmt.
printf
("animal.name=%s,animal.age=%d,animal.color=%s,address=%s,name=%s\n"
, d.name, d.age, d.color, d.
string
, d.mystr)
}
package main
import
"fmt"
type animal struct
type dog struct
func
main()
,"上海"
} fmt.
printf
("d=%+v\n"
, d)
fmt.
printf
("name=%s,age=%d,color=%s,address=%s\n"
, d.name, d.age, d.color, d.address)
var t dog
t.animal =
new(animal)
//分配記憶體空間
t.name =
"旺財"
t.age =
2 t.color =
"白色"
t.address =
"北京"
fmt.
printf
("t=%+v\n"
, t)
fmt.
printf
("name=%s,age=%d,color=%s,address=%s\n"
, t.name, t.age, t.color, t.address)
}
如果巢狀結構體的內部結構體實現了乙個方法,但是外部結構體沒有實現這個方法。
如果匿名組合的匿名字段實現了乙個方法,那麼外部結構體也就實現了這個方法。
匿名組合的匿名字段實現了乙個方法。如果外部結構體對此方法進行了修改,這就叫做方法的重寫。
package main
import
"fmt"
type animal struct
type dog struct
func
(a *animal)
eat(
)func
(d *dog)
sing()
func
main()
,"上海"
} fmt.
printf
("d1=%+v\n"
, d1)
d1.eat(
)//繼承了方法eat
d1.sing()
}
package main
import
"fmt"
type animal struct
type dog struct
func
(a *animal)
eat(
)func
(d *dog)
eat(
)func
main()
,"上海"
} fmt.
printf
("d1=%+v\n"
, d1)
d1.eat(
)}
高階物件導向
最基本的物件導向寫法 建立建構函式 function aaa 構造方法 aaa.prototype.showname function 使用 建立例項 var a1 new aaa a1.showname 在js原始碼中 系統物件也是基於原型的程式 function array array.prot...
Day16 JS高階 物件導向高階高階
一 物件建立模式 二 繼承模式 一 物件建立模式 用各種各樣的方式來建立物件 方式一 object 建構函式模式 第二種方式 方式三 工廠模式 這種方法的不足就是 物件沒有乙個具體的型別,如果我們想要又這樣具體的型別的話,就要自定義乙個型別了 方式四 自定義建構函式模式 這樣的話這兩個就有了具體的型...
python高階 物件導向
使用類名.mro 可以檢視到下乙個呼叫的是哪個父類 import copy deftest2 a,b,args,kwargs print print a print b print args print kwargs deftest1 a,b,args,kwargs print a print b ...