行くコア開発の研究ノート(Niansan) - オブジェクト指向プログラミング、工場出荷時のモード

オブジェクト指向プログラミング

基本的な手順比較パイソン

  1. クラスXXX():文の構造は、構造体は、クラス名//の名前を確認するために決定されます。
  2. DEF://クラス属性確認のフィールド構造決定のinit
  3. 構造体の製造方法は、//クラスメソッドを確認します。def XX():

最も簡単な例:名前の文字列、性別列、年齢はint、int型のnum、能力のfloat64フィールドを含む、プレイヤーの構造を書き、書く方法を、その呼び出しの後に戻っプレーヤーのすべての情報

package main
import "fmt"
type player struct {
	name string
	gender string
	age int
	rolenum int
	ability int
}

func (p *player) callback() string {
	res := fmt.Sprintf("定义球员信息如下:\n姓名:%v\n性别:%v\n年龄:%d\n球衣号码:%d\n能力值:%d\n",p.name,p.gender,p.age,p.rolenum,p.ability) //定义字符串打印的可以传递变量
	return res
}

func main() {
	var p1 *player = &player{"durant","male",30,35,94}   //后续工程中优秀做法是把结构体指针返还给变量,因为指针传递值很小,效率高
	res := p1.callback()
	fmt.Println(*p1)      //由于var是一个指针,所以当查看实例的时候前面会加一个&符,去掉只需要打印*p1取值即可
	fmt.Println(res)
}

問題を解決するためにファクトリパターンを使用して、コンストラクタをGolangありません

非メインパッケージは、構造体を定義しますが、最初の文字を小文字、構造体のフィールドは小文字である、(メイン内の構造とフィールドを呼びたい)、一般的には、解決するために工場出荷時のパターンを選択し、完了することはできません。

パッケージを書くための従来の方法は、インポートすることができません。

package utils                //创建一个utils包

type students struct {       //这个结构体是小写,无法用于其他包导入     
	Name string
	Age int
	score float64            //这个结构体的字段是小写,无法用于其他包导入
}

func Student(n string,a int) *students {    //写一个方法,装饰一下,方法本身首字母大写,所以可以被其他包导入,解决结构体小写问题
	return &students{                       //传递参数和结构体字段一模一样,返回值是结构体指针变量,存放在堆中,共享的,大家都可以使用
		Name : n,
		Age : a ,
	}

func (s *students) Getscore() {             //写一个方法,装饰一下,方法本身首字母大写,所以可以被其他包导入,解决结构体字段小写问题
	return (*s).score	                        //直接将utils函数中的score返回给一个首字母大写函数,在main包中再调用这个函数获得值
}

メイン機能で導入Utilsのパッケージ:

package main
import (
	"fmt"
	"utils"
)

func main() {
	var stu = utils.Student("zhaolu",20)    //使用函数传递两个参数,stu接收函数的返回值也是一个指针
	fmt.Println(*stu)                       //为了查看字段值,需要用取值符取得变量。
	fmt.Println(stu.Getscore())             //这样就可以访问私有字段了
}

オブジェクト指向プログラミングのアイデア - 抽象

  1. 最初は彼らの視点は、学んだ場合K8Sは、リソース・プールに、(抽象化)抽象的であるリソースの抽象様々なタイプの全体K8Sの本質を見つけなければならないということです - >種類、製品のGoogleのファミリーは、自然にGolangに反映します。
  2. 物事のクラスの共通プロパティとメソッドは、このアプローチの研究課題は、抽象と呼ばれる、物理モデルの形で抽出されます。
  3. モデルを作成しますので、上の撤退、移転、残高照会や名前、口座番号、残高、方法:銀行口座、プロパティのシステムの開発を。
  4. オブジェクト指向三つの特徴:カプセル化、継承、ポリモーフィズム、異なるGolang実装、道の弱体化ではなく、他のOOP言語には、比較余儀なくされました。

パッケージのカプセル化:

  1. フィールドに一緒に抽象パッケージングフィールドとフィールドの操作、保護されるべきデータの中に、他のプログラムパッケージのみが許可されたオペレータが操作することができます。
  2. パッケージングは​​、合理性の安全性を確保するため、データの検証を実装の詳細を非表示にすることができます。
  3. Golangパッケージは、他の小文字のインポートを工場出荷時の制御モードフィールドの動作の安全性を向上させるためにパッケージを制御することにより、上述した実施形態は、下部ケースにパケット構造フィールドです。

パッケージの実装手順

  1. 最初の文字を小文字構造は、フィールド(ないエクスポート、およびインポート他のパッケージはJavaの民間と同様に、使用することはできません)。
  2. パッケージが提供する場合、最初の文字の構造関数に工場出荷時のパターンは、(別のパッケージ構造を呼び出すためのアクセス許可の設定)コンストラクタと同様に、大文字。
  3. (Javaのパブリックと同様)大文字の設定方法は、(フィールド構造は、他のパッケージを呼び出すために許可を設定されている)の特性や課題を決定するために使用されます。
    第三のハイライト、設定方法の増加、およびビジネス・ロジックは、値の範囲に制限することができ、フィールド構造と呼ばれているリコールパケット構造フィールドを設定し、他のプロセス条件の制限に従わなければなりません。
    またはGetメソッド、または対応する変数を受け取る主に必要とされる所望のフィールドの戻り値を、()増加。

たとえば、次のようにデータの脱感作はPerson構造を確立するために行うことができ、年齢への直接アクセスを保証することはできません、最初のデモパッケージを作成します

package demo
import "fmt"
type person struct {
	Name string
	age int
}
func Person(n string) *person {        //因为Name字段为大写,所以只需要通过工厂模式提供的Person函数就直接访问
	return &person{
	Name : n,
	}
}
func (p *person) SetAge(age int) {     //因为age字段为小写,所以需要构造方法,提供设置和访问方法,不可以直接使用<引入包结构体变量>.<结构体字段>的方式使用
	if age > 0 || age < 150 {
		p.age = age
	} else {
		fmt.Println("输入的年龄不符合要求,默认为18岁")
		p.age = 18
	}
}
func (p *person) GetAge() int {
	return p.age
}

メインでの使用は()メソッドを設定および取得し、セットの呼び出しは、直接使用することはできません使用して、<フィールド構成>方法<パッケージ構造変数に導入します>

package main
import (
	"demo"
	"fmt"
)
func main() {
	var p = demo.Person("马云")
	p.SetAge(50)
	fmt.Println(p.GetAge())
	fmt.Println(*p)
	fmt.Println(p.Name)
}

継承:

  1. 共通の属性と同じ属性とメソッドが定義された新しい構造で記述された異なる構造、方法の抽出、親クラスをサブクラスでGolang存在しません。

  2. 匿名の構造を埋め込むことで、完全には疎結合します。

  3. 継承の利点:改良されたコードの再利用、コードの拡張性と保守性が向上します。

    リファレンスと属性の例があります。

    type Students struct {          //定义一个共有结构体属性:学生,学生一定都有姓名,年龄和学号
    	Name string
    	Age int
    	SerialNo int
    }
    
    type Xiaoxuesheng struct {
    	Students          //定义一个结构体是小学生,引入共有结构体属性,也就拥有了姓名,年龄和学号
    	angery string     //小学生有一个独有属性:小学生之怒,如果需要引入其他结构体,除了共有属性之外,自由定义独有属性
    }
    

例示の方法および参考文献があります。
FUNC(STU *学生)<メソッド名>(){...、stu.Nameは、そのようなstu.Age} //この方法は、生徒構造に埋め込まれた他の構造でも使用することができます。

構造の属性フィールドの割り当てがあります:
<新しい構造名> <共通の属性構造フィールド> //例<構造の共通属性>を、学生が名..定義Xiaoxuesheng.Students.Name =「チョン」
の使用をメソッド構造の合計:
<新しい構造名> <構造の共通属性> <共通の属性メソッド名>など(、)(小学校受験Xiaoxuesheng.Students.examingをexaming、総受験を増やすなど()//メソッド)

相続の徹底的な議論

  1. 新しい構造は、匿名の構造、すなわち、最初の文字大文字にも小文字フィールド、メソッドのすべてのフィールドとメソッドを使用することができ、入れ子に使用することができます.GOファイルに限定され、他をインポートする試みを行っておりません。

  2. 簡素化された文言は、例えば、定義および使用のフィールドは、直接、共通の属性の階層構造を省略することができたとき:
    <新しい構造名> <フィールド構造の共通属性> <構造の共通属性>新しい構造の== <名前を。 >。<共通>は//構造体のフィールド属性Xiaoxuesheng.Name = "チョン"
    <新構造名>。<共通の構造を属性>。<共通のメソッド名を属性>()== <新構造名>。 <メソッド共通属性名>()// Xiaoxuesheng.plusbuff()= " 既得ボディケア"

  3. あなたはフィールド名と同じ名前を持ち、新しい構造に構造の合計をフィールド場合、それは、<新しい構造名>を採用しています。<共通の構造体のフィールド属性>が、<新しい構造名> <新構造フィールド>、規則に従って一致するものが見つかったら、フィールドを指定したので、近接の原理であるフィールド名の最も優秀な第一外層を、選択してください、それはA.に沿ったものである<フィールド>はAB <場>を見つけることができません。

  4. 新しい構造は、二つの構造の合計に埋め込まれている場合も同様に、2つの構造が存在する場合には、同じフィールド名、Cを使用して、新しい構造<合計フィールドを>持って、コンパイラが文句を言うだろう、この時間は、匿名の構造を指定する必要があります割り当て、表示するために名前CANameの =「犬」CBName =「猫」、直接c.name =「XX」は避けられないエラー、同じ理由のための方法を。

  5. 構造の関係、匿名の構造およびそれらの組み合わせを理解する:構造の組み合わせなら、それは継承されず、この時間は、書き込みを簡単にするために選択することができない、とBA <フィールド> =「XX」を使用しなければなりません
    例示:
    (1)タイプを構造体{...}型B構造体 {A ...}: 匿名の構造を簡素化することができ、BA <A field> == B. <Aはfield> bAName == b.name
    (2){...}型構造体を入力しますB構造体A {...}:組み合わせ構造、簡素化することができない、BAの<a field> = B. <A field>!baName = "XX"

  6. C A、B 2つの匿名構造体、ポインタを渡すことができる構造体{C型ネスト必要に応じて、または継承の組み合わせは、変数の定義は、直接的にネストされた割り当てを使用することができるA \ N- B}は、転写効率が多いよう高いです。
    値は、*のcA <場>を書かなければならない場合は、アドレス全体です。

  7. 多重継承:別の匿名の構造は同じフィールドを持っている場合ではない、推奨、多重継承は、あなたが<匿名の構造名> <フィールド名>を指定する必要があります。この階層は、異なる名前空間が同じフィールドを提供し使用するのと同じです。

マルチステート
言ってインタフェースを行う研究、多型はほとんどインターフェースインターフェースを介して達成されます。

公開された49元の記事 ウォン称賛18 ビュー4004

おすすめ

転載: blog.csdn.net/weixin_41047549/article/details/90169862