あなたが継承する方法を理解するように、2つ分を行きます

最近、インタフェースの抽象多数のコードをリファクタリングします。また、これらの抽象インタフェースは大幅にコードの冗長性を削減するだけでなく、コードの可読性を向上させる、擬似継承された操作の多くを行う使用しています。

それからちょうど最後にそれを見ている人が忘れてしまった、囲碁相続に関する記事の瞬間を検索し、コードの過剰量のいくつかの記事を見つけ、コードの形式は、このB、Aのように、非常にカジュアルな名前の、非常に荒れています誰が、私は戻って、ロジックを通読して持っている人、継承されました。

唯一のサンプル・コードが、私はそれがまだ行われる必要がある、シンプルな明確で分かりやすいと思います。また、これは私がこのブログを書く理由です。移動中の継承を実装する方法をあなたと簡単に共有に引き継ぎました。

1.単純な組み合わせ

私たちは皆、それがない囲碁では、相続に来るときことを知っていますextendsGo]を継承していないことを意味するキーワード、ネイティブレベルをサポートしています。私は記事の冒頭で使わ理由はここにあり継承擬似単語を。基本的に、組み合わせと呼ばれる機能を使用して実装されたインタフェースをGO、GOを達成するために、継承を使用しての組み合わせであり、代わりに相続の組み合わせを使用するのでは、と言って、より正確で、非常に簡単な例を与えます。

1.1親実装

我々は理解することは非常に使いやすい動物 - の例として、ここでは、ADO、コードで直接見て。

type Animal struct {
    Name string
}

func (a *Animal) Eat() {
    fmt.Printf("%v is eating", a.Name)
    fmt.Println()
}

type Cat struct {
    *Animal
}

cat := &Cat{
    Animal: &Animal{
        Name: "cat",
    },
}
cat.Eat() // cat is eating

1.2コード分析

まず、私たちは動物を表現する、動物の構造を実装しました。そして、動物の名前を記述するために使用される名前フィールドを宣言。

その後、受信機のための方法を食べ、動物の摂食行動を記述するために動物を実装するためです。

最後に、それは猫の構造、猫のフィールドの組み合わせを宣言します。そして、食べるメソッドを呼び出して、猫をインスタンス化し、あなたが希望通常の出力を見ることができます。

、カタログ番号Nameフィールド構造自体見ることができ、食べ達成するための方法はありません。唯一の動物のスーパーの組み合わせがあり、これまでのところ、我々は、継承の組み合わせによって達成されたことを証明しています。

優雅2.組み合わせ

ため息を次のように上記のコードで慣れている人を見に行く発行することができます

これは右、あまりにもラフである - 魯迅で:私はこれらの言葉を言っていませんでした

実際、上記の人々が行くの外観の組み合わせを理解していないことだけです。組み合わせ囲碁の継承を理解するための簡単な例として、それは問題ありません。あなたは本当の開発に使用する場合でも、それはまだ十分ではありません。

私は、この抽象クラスの利用者であれば、例えば、私は動物のクラスを取得することはできません呼び出すことができますどのような方法で、クラスが何をしたか一目でわかります。そして、場所の初期化に関連するすべての重複したコードを持っていることを意味し統一の初期化方法、ありません。変更の隣後の初期化に関連した変化であれば、1つだけ。それでは、私たちは、上記のコードのいくつかの最適化を行います。

2.1抽象インタフェース

インターフェイスは、クラスの振る舞いを記述するために使用されます。たとえば、私たちは、抽象へ約インターフェイスは動作を持つ動物動物、として説明するされています。常識は、動物が(食べる)食べることができることを教えてくれる(樹皮)を鳴らすことができ、その上で(移動)を移動し、することができます。非常に興味深いアナロジーがあります。

インタフェースは、スターバックスなどの記号、のようなものです。スターバックスは、記号(インターフェース)です。

あなたは、符号が思っただろうものを見ますか?アメリカ人?フラペチーノ?抹茶ラテ?またはカフェラテ、あるいは店内のインテリア。

これは、我々が同じ抽象インタフェースを必要とする理由である、良好な界面が達成すべきです。

// 模拟动物行为的接口
type IAnimal interface {
    Eat() // 描述吃的行为
}

// 动物 所有动物的父类
type Animal struct {
    Name string
}

// 动物去实现IAnimal中描述的吃的接口
func (a *Animal) Eat() {
    fmt.Printf("%v is eating\n", a.Name)
}

// 动物的构造函数
func newAnimal(name string) *Animal {
    return &Animal{
        Name: name,
    }
}

// 猫的结构体 组合了animal
type Cat struct {
    *Animal
}

// 实现猫的构造函数 初始化animal结构体
func newCat(name string) *Cat {
    return &Cat{
        Animal: newAnimal(name),
    }
}

cat := newCat("cat")
cat.Eat() // cat is eating

実際には、コンストラクタ内の移動の定義はありません。例えば、我々は非常に簡単な例を与える、変数を初期化するためにJavaのコンストラクタで使用することができますInteger num = new Integer(1)初期構造により実現し、ユーザ自身のコンストラクタをシミュレートすることが必要に移動します。

そして、ここでは、動物のメソッドを呼び出すために、相続の代わりにの組み合わせを使用して、サブクラスの猫を実現します。我々が見ることができ、実行、猫の構造ではなく名前]フィールドの後、方法を食べ実現しませんでしたが、あなたはまだ正常に動作することができます。これは、私たちが継承の組み合わせによって達成していることを証明しています。

2.2オーバーロードされたメソッド

// 猫结构体IAnimal的Eat方法
func (cat *Cat) Eat() {
    fmt.Printf("children %v is eating\n", cat.Name)
}

cat.Eat()
// children cat is eating

見ることができ、猫の構造が過負荷に達成ので、メソッドを食べる動物でオーバーロードされています。

2.3パラメータ化

それは何を意味するのでしょうか?たとえば、どのように我々は、Javaでの多形性関数のパラメータの問題を解決するのですか?ジャワに泊まった、ソリューションを考えるかもしれませんが、それはワイルドカードです。一つの文章、ワイルドカードの使用は、すべてのサブタイプのすべてのスーパータイプまたはクラスのクラスを受けるように機能することができるようにします。しかし、私は個人的にJavaのに慣れていない人のために、読みやすさは特に友好的ではないと思われます。

ゴーでは、それは非常に便利になります。

func check(animal IAnimal) {
    animal.Eat()
}

この機能ではタイプは、Javaに対応して動物のユニットのすべての組み合わせを扱うことができ、人々を文章に戻った後、任意の特定のタイプと派生クラスの特定のタイプのワイルドカードを扱うことができる上限ワイルドカードで、どのような動物それは扱うことができます。

3.まとめ

すべては二つの側面を持って、最適化を行うことは例外ではありません。抽象インタフェースの多くは、実際にコードを合理化することができますので、コードは非常にエレガントで快適に見えます。しかし、再び、これは他の人がコストを理解して生じたレビューコードに精通していない提供します。あなたがコードの一部を見想像し、すべてのインタフェースが実現見るためにいくつかの層を指します。より多くの、そして彼は突然見つけ手動で行くには別の場所を見つけるために登録する必要があります別のインターフェイスに決裂しました。

これは私が直面する時間を最適化するために、いくつかの質問を考えています:

  • エレガント
  • 可読
  • 演奏

時には例えば、タフなコードが、エレガントなコードよりも優れたパフォーマンスを書き、アカウントにすべての3つの側面を行うことは困難です。別の例として、書き込みは非常にエレガントに見えますが、読みやすさはそれほどに悪い、と。

それとも私の以前のブログで参照しばしば言葉を書きます

彼らのために最善であります

この時、自分のプロジェクトの唯一の特定の状況では、あなたのために最も適したソリューションを選択してください。普遍的な解決策はありません。

最近ギターを演奏見共有毒チキンスープの1、学習は同じです。

迂回路の完全な道路練習に近道は、ありません

過去の記事:

関連:

  • 公共マイクロチャンネル番号:SHフルスタックノート(または直接マイクロ検索インターフェース信号LunhaoHuの公開番号を追加)

おすすめ

転載: www.cnblogs.com/detectiveHLH/p/11738467.html