『松本行弘のプログラム世界』を読む

1928 ワード

読みながら記録すると、文章が長くなるので、一度では書けません
オブジェクト向け:2.3.8で説明したように、継承関係を含むクラスのみが多態性を持つことをどのように考慮しますか.プログラミングの時によく要求する拡張性、拡張性を実現する1つの重要な方法は抽象化で、データとそのする処理に対してすべてカプセル化して、1つの黒い箱として、その内部がどのように実現するかを気にしないで、私はただ1つの入力だけを必要として、あなたは私に1つの私の望む出力をあげて、C言語などのプロセスに向かう言語の中でデータに対してカプセル化する構造体に比べて、オブジェクト言語向けの使用クラスはデータとその操作方法をカプセル化し、データの処理はこれらの操作方法で行われ、ここのクラスはすでにブラックボックスであり、その処理方法は分からないが、所望の結果を得ることができ、ブラックボックスの出現はプログラムの複雑さを低減することができる.このブラックボックスを使用した他のプログラムについては、ブラックボックスに現れた修正変更は見えないため、変更を必要とする実装者が再びこのブラックボックスを変更した後も、外部でこのブラックボックスを使用するプログラムにコード上の影響を与えることはなく、結果的な一致は実装者が完備したユニットテストを使用して保証することができる.多態性については、多くの資料ですでに多く言及されています.すなわち、異なる種類のものを同じクラスとして解決し、オブジェクト向けのプログラミング言語には次の2つの共通の特性があります.
1.内部の詳細な処理を知ることなく操作できる(パッケージ化、データ抽象)2.異なるデータ型に応じて適切な方法を選択する(多態性)
1つ目は冒頭に書いた内容で、2つ目は、本に書いてある内容に従って、データ型に応じて適切な処理(適切な方法を呼び出す)を行うことがプログラミング言語で完了するべきであることをどのように理解すればいいのでしょうか.構造化されたプログラミング方法はプログラムロジックの制限をもたらし、私たちが必要とする機能を実現し、プログラムの自由度を低下させるが、シーンを想定する.
public void Open(box) {
if(TypeOf(box) == "A")
{
system.out.println("    ");
}

else if(TypeOf(box) == "B")
{
system.out.println("  ,    ");
}

 else
{
system.out.println("     ");
}

}
この時にタイプCが追加されたので、上の構造を書き直す必要があります.正常に動作するコードを変更するとリスクがあります.
public class A {
    public void Open(){system.out.println("    ");}

}
public class B {
    public void Open(){system.out.println("  ,    ");}

}
継承はマルチステートを実現する基礎であるため,A,B,CがオブジェクトBoxから継承されると,Openメソッドを直接呼び出すことでif,elseの機能を実現できる.マルチステートは、コードに現れるブランチの数を減らし、拡張時に新しい使用を満たして修正を避けることができます.
多重継承と単一継承Javaでは、C#のクラスは単一継承しかできません.これは、構造が簡単なためです.クラスの多重継承を許可する場合、クラス間の関係はツリーではなく図になります.これにより、継承された2つの親が同じ実装方法で競合する可能性があります.すなわち、1つは優先度の問題であり、もう1つは、クラスに問題が発生すると、多重継承は問題の位置づけに迷惑をかけます.しかし、多重アイデンティティのクラスでは、多重継承は欠かせない.したがってJavaでは,クラスは単一継承(extends)のみを許可するが,インタフェースは多重継承(implements)を許可し,RubyではMix-inを用いて解決する.