oop チュートリアル
oopを使い始める
サーチ…
備考
オブジェクト指向プログラミング(OOP)は、「オブジェクト」の概念に基づくプログラミングのパラダイムであり、フィールドの形でデータを含むことがあります。プロシージャの形で、しばしばメソッドとして知られています。
前書き
OOP - オブジェクト指向プログラミングは、最近広く使われているプログラミングのパラダイムです。 OOPでは、オブジェクトを使って実世界の問題をモデル化し、それをプログラムで解決するためにビヘイビアを実装します。
4つの主なOOPの概念
- 継承
- 多型
- 抽象化
- カプセル化
これら4つの概念は、OOPでプログラムを開発するために一緒に使用されます。
オブジェクト指向プログラミングを支える様々な言語があります。最も人気のある言語は
- C ++
- Java
- C#
- Python(Pythonは完全にオブジェクト指向ではありませんが、そのほとんどのOOP機能を備えています)
OOPの紹介
入札
オブジェクト指向プログラミング(OOP)は、問題を解決するためのプログラミングパラダイムです。
OO(オブジェクト指向)プログラムの美しさは、特定の注文に続くスクリプトではなく、お互いに通信するオブジェクトの束としてプログラムを考えることです。
OOPをサポートする多くのプログラミング言語がありますが、人気のあるものは次のとおりです。
- Java
- C ++
- C#
PythonはOOPをサポートすることも知られていますが、いくつかのプロパティはありません。
OOPの用語
OOPの最も基本的な用語はクラスです。
クラスは基本的にオブジェクトであり、状態を持ち、その状態に従って動作します。
別の重要な用語はインスタンスです。
クラスは、それ自身のインスタンスを作成するために使用されるテンプレートと考えることができます。クラスはテンプレートであり、インスタンスは具体的なオブジェクトです。
クラスAから作成されたインスタンスは、通常 'タイプA'から参照されます 。つまり、 5の型がintで、 「abcd」の型が文字列です。
型(class)のinsance1というインスタンスを作成する例ClassA :
Java
ClassA instance1 = new ClassA();C ++
ClassA instance1;または
ClassA *instance1 = new ClassA(); # On the heapPython
instance1 = ClassA()
上の例で見られるように、すべての場合において、クラスの名前が言及され、その後に空のカッコがありました(ただし、空の場合はカッコを削除できます)。これらのカッコでは、クラスのコンストラクタにargumentsを渡すことができます。
コンストラクタは、インスタンスが作成されるたびに呼び出されるクラスのメソッドです。それは引数を取るかどうかを取ることができます。プログラマが構築するクラスのコンストラクタを指定しない場合、空のコンストラクタが作成されます(何もしないコンストラクタ)。
ほとんどの言語では、コンストラクタは戻り値の型を定義することなく、クラスの同じ名前で定義されます(いくつかのセクションの例)。
タイプ(クラス) ClassBの b1という名前のインスタンスを作成する例ClassBのコンストラクタはint型の1つの引数をとります:
Java
ClassA instance1 = new ClassA(5);または
int i = 5; ClassA instance1 = new ClassA(i);C ++
ClassA instance1(5);Python
instance1 = ClassA(5)
ご覧のとおり、インスタンスを作成するプロセスは、関数を呼び出すプロセスと非常によく似ています。
関数とメソッド
関数とメソッドのどちらも非常に似ていますが、オブジェクト指向設計(OOD)ではそれぞれ固有の意味を持ちます。
メソッドとは、クラスのインスタンスに対して実行される操作です。メソッド自体は通常、インスタンスの状態を使用して操作します。
一方、関数はクラスに属し、特定のインスタンスには属しません。つまり、クラスの状態やインスタンスに格納されているデータは使用されません。
ここからは、OOPはこの言語では非常に明確ですので、 Javaでのみ例を示しますが、他のOOP言語でも同じ原則が使用できます。
Javaでは、関数の定義にstaticという単語があります 。
// File's name is ClassA
public static int add(int a, int b) {
return a + b;
}
つまり、スクリプト内のどこからでも呼び出すことができます。
// From the same file
System.out.println(add(3, 5));
// From another file in the same package (or after imported)
System.out.println(ClassA.add(3, 5));
関数を別のファイルから呼び出すときには、クラスの名前(Javaではこれもファイルの名前です)を使用します。これは関数がそのクラスのインスタンスではなく、クラスに属するという直感を与えます。
これとは対照的に、私たちはClassAのメホドを以下のように定義することができます:
// File's name is ClassA
public int subtract(int a, int b){
return a - b;
}
この解読の後、このメソッドを以下のように呼び出すことができます:
ClassA a = new ClassA();
System.out.println(a.subtract(3, 5));
ここでは、そのメソッドの減算を呼び出すために、 ClassAのインスタンスを作成する必要がありました。次のことはできないことに注意してください。
System.out.println(ClassA.subtract(3, 5));
この行は、インスタンスなしでこの非静的メソッドを呼び出すと、コンパイルエラーが発生します。
クラスの状態を使用する
subtractメソッドをもう一度実装したいとしましょうが、今度は常に(同じインスタンスごとに)同じ数を減算したいと考えています。次のクラスを作成できます。
class ClassB {
private int sub_amount;
public ClassB(int sub_amount) {
this.sub_amount = sub_amount;
}
public int subtract(int a) {
return a - sub_amount;
}
public static void main(String[] args) {
ClassB b = new ClassB(5);
System.out.println(b.subtract(3)); // Ouput is -2
}
}
このコードを実行すると、 ClassBクラスのbという名前の新しいインスタンスが作成され、そのコンストラクタに値5が与えられます。
コンストラクタは指定されたsub_amountを受け取り、 sub_amountとも呼ばれる独自のプライベートフィールドとして格納します (この規約はJavaでは非常によく知られており、引数にフィールドと同じ名前を付けています)。
その後、値3の bのメソッド減算を呼び出した結果をコンソールに出力します。
減算の実装では、 this.使用しないことに注意してくださいthis.コンストラクタのように。
Javaでは、 thisは、そのスコープで定義された同じ名前の別の変数がある場合にのみ記述する必要があります。 Pythonのself同じことが働きます。
したがって、 subt_amountをsubtractで使用すると、クラスごとに異なるプライベートフィールドを参照します。
強調する別の例。
上記のコードのmain関数を次のように変更しましょう:
ClassB b1 = new ClassB(1);
ClassB b2 = new ClassB(2);
System.out.println(b1.subtract(10)); // Output is 9
System.out.println(b2.subtract(10)); // Output is 8
わかるように、 b1とb2は独立しており、それぞれ独自の状態を持っています 。
インタフェースと継承
インタフェースは契約であり、クラスが持つメソッドとその能力を定義します。インタフェースは実装を持たず、実行する必要のあるものだけを定義します。
Javaの例は次のとおりです。
interface Printalbe {
public void print();
}
Printalbeインタフェースはprintというメソッドを定義していますが、その実装はしていません(Javaではかなり変わっています)。このインタフェースのimplementingとして宣言しているすべてのクラスは、drawメソッドに実装を提供する必要があります。例えば:
class Person implements Printalbe {
private String name;
public Person(String name) {
this.name = name;
}
public void print() {
System.out.println(name);
}
}
PersonがDrawableの実装として宣言しても、 印刷の実装を提供しなかった場合、コンパイルエラーが発生し、プログラムはコンパイルされません。
継承は、別のクラスを拡張するクラスを指す用語です。たとえば、年齢のある人がいるとします。そのような人を実装する1つの方法は、 Personクラスをコピーし、同じフィールドとメソッドを持つAgedPersonという新しいクラスを作成することですが、別のプロパティを持ちます。
シンプルな機能をクラスに追加するだけでコード全体を複製するので、これはひどいことになります。
継承を使用してPersonから継承し、そのすべての機能を取得してから、次のような新しい機能を追加することができます。
class AgedPerson extends Person {
private int age;
public AgedPerson(String name, int age) {
super(name);
this.age = age;
}
public void print() {
System.out.println("Name: " + name + ", age:" + age);
}
}
新しいことがいくつかあります:
- 私たちは、保存された単語が使わ
extends私たちは人から継承さを示すために、( 印刷用にもその実施をして、私たちは宣言する必要はありませんimplementing Printable再び)。 - 私たちは、 Personのコンストラクタを呼び出すために
superという単語を使用しました。 - Personの印刷メソッドを新しいもので上書きしました。
これはかなりJavaの技術を得ているので、私はこのトピックに深く関わっていません。しかし、私はそれを使用する前に継承とインターフェイスについて学ばなければならない極端なケースがたくさんあることに言及します。たとえば、どのメソッドと関数が継承されていますか?クラスを継承すると、プライベート/パブリック/プロテクトフィールドはどうなりますか?等々。
抽象クラス
抽象クラスは、OOPのかなり高度な用語で、インタフェースと継承の両方の組み合わせを記述します。実装されているメソッドと実装されていないメソッド/関数の両方を持つクラスを記述することができます。Javaでは、これはabstractというキーワードを使用して行います。
abstract class AbstractIntStack {
abstract public void push(int element);
abstract public void pop();
abstract public int top();
final public void replaceTop(int element) {
pop();
push(element);
}
}
注: finalキーワードは、このクラスから継承したときにこのメソッドをオーバーライドできないことを示します。あるクラスがfinal宣言されている場合、それからクラスを継承することはできません。