OOP 201:設計概念


この記事は、クラスに適用する重要なオブジェクト指向のデザイン概念のいくつかをカバーします:カプセル化、過負荷、継承と多型.

カプセル化


カプセル化は、コードの他の部分にさらされる必要がない情報を隠すプロセスです.クラスを使用すると、プロパティとメソッドのスコープを使用してこれを制御できます.少なくとも目に見えるものから最も目に見えるものまで、個人的で、保護されていて、公共です.

プライベート


スコープをprivateに設定すると、項目は現在のクラスインスタンス(または共有アイテムのクラス)からのみアクセシビリティになっています.これにより、コードの残りの部分にアクセスできなくなります.
プライベートは最も制限的な設定です.クラスインスタンスの外で必要でないならば、あなたのアイテムを個人に設定する習慣に入るのは良いコーディング練習です.プライベートアイテムは自分の名前で参照することができます.

保護


保護された手段の範囲は、項目が現在のクラスインスタンス(または共有アイテムのクラスそのもの)とそのサブクラスからアクセス可能です.
保護されたメソッド、プロパティ、または定数は、クラスに基づいてクラスとサブクラス内の他のコードにのみ使用できます.他のコードにアクセスできません.クラス内の他のコードが保護されたメソッド、プロパティ、または定数にアクセスする必要がある場合は、名前で参照します.クラスの外側に保護されたメソッド、プロパティ、または定数にアクセスしようとすると、プロジェクトを実行しようとすると、項目がスコープ外であることを示すエラーメッセージが表示されます.

公共


パブリックメソッド、プロパティ、または定数は、プロジェクト全体でコードを使用できます.クラス内で、その名前で項目を参照できます.クラス外のコードでは、クラスリファレンスと名前などのドット表記を使用します.
car.Model
例として:
  • ClassAはオブジェクトです.classbはクラスクラスのサブクラスです.
  • ClassAパブリックメソッドMyPublicMethodを定義します.このメソッドはどこからでも呼び出すことができます.
  • classAプロテクションメソッド、MyProtectedMethodを定義します.クラスAまたはclassBはそのメソッドを呼び出すことができます.
  • ClassAはプライベートメソッドを定義します.クラスAのみがメソッドを呼び出します.
  • 過負荷


    オーバーロードは、同じ名前を持つメソッドの用語ですが、異なるメソッドシグネチャ(パラメーターのパラメーター数やデータ型が異なるなど)を持ちます.
    注意: Xojoでは、別の戻り値型に基づいてメソッドをオーバーロードすることはできません.オーバーロードは、戻り値の型を持ち、戻り値の型をまったく区別しません.
    独自のクラスでメソッドをオーバーロードするには、新しいメソッドをクラスに追加し、既存のメソッドと同じ名前を付けますが、異なるパラメーターを指定します.このメソッドは、メソッドの下に示すオーバーロードされたパラメーターを持つナビゲータに表示されます.

    組み込みのフレームワーククラスでメソッドをオーバーロードするには、まず継承を使用してサブクラスを作成する必要があります.
    また、様々な特殊実装関数を使用して演算子をオーバーロードできます.組み込みのオーバーロードされた演算子の良い例は"+"演算子です.引数が数値の場合、和を計算する引数がtextならば、テキストを連結します.

    継承(サブクラス化)


    継承は、既存のクラスに基づいた新しいクラスを作成するオブジェクト指向プログラミングの機能です.新しいクラスをサブクラスと呼び、既存のクラスをスーパークラスと呼ぶ.サブクラスは「継承します」、したがって、そのスーパークラスのすべてのパブリックで保護されたプロパティとメソッドを使用することができます.
    なぜこれが役に立つのですか.あなたは、組み込みクラスの1つのわずかに変更されたバージョンであるオブジェクトを持ちたいと思う状況を見つけるかもしれません.たとえば、TextAreaコントロールのバージョンを使用すると、エディットメニューでカットアイテムとコピー項目を無効にし、ユーザーがクリップボードに機密データを配置するのを防ぎます.既定では、年の月を持っているリストボックスを作成したい場合があります.これらの組み込みクラスの独自のバージョンを作成するには、プロジェクトに追加するサブクラスを作成します.
    TextFieldに基づいてサブクラスをプロジェクトに追加するには、TextFieldのインスタンスをウィンドウに追加するのに重要な違いがあります.後者の場合、TextField自体に基づいてサブクラスをカスタマイズでき、カスタマイズされたサブクラスのインスタンスをアプリケーションのいくつかの場所に使用できます.また、他のプロジェクトで再利用できるようにカスタマイズされたサブクラスを保存することもできます.

    サブクラスは何ですか。


    サブクラスはスーパークラスを持つクラスである.スーパークラスはサブクラスをベースとするクラスであり、親クラスと呼ばれることもある.サブクラスは、スーパー(publicまたはprotected)プロパティ、メソッド、定数のすべてを継承します.サブクラスはまた、スーパークラスで実装されていないイベントハンドラを実装したり、スーパークラスでイベント定義を実装することができます.
    実際、サブクラスはスーパークラスと同じように働きます.その後、スーパークラスと異なるのは、プロパティを追加したり、イベントを変更したり、メソッドを追加したり、修正したりすることによって異なります.
    サブクラスは、スーパークラスのパブリックプロパティまたはプロテクトプロパティのいずれかを既定で使用できます.

    既存のクラスからサブクラスを作成する


    プロジェクトの既存クラスからサブクラスを作成する方法や既存のフレームワーククラスからいくつかの方法があります.
  • 組み込みのコントロールクラスをサブクラスにしたい場合は、ライブラリからコントロールをナビゲータにドラッグできます.
  • ナビゲータのクラスを選択し、コンテキストメニューのオプション“new subclass”を使用して、選択したクラスに基づいて新しいサブクラスを作成できます.
  • あなたのプロジェクト(ツールバーまたは[挿入]メニューの[挿入]ボタンを使用して)にクラスを追加し、手動でそのスーパープロパティを使用するクラスの名前に変更できます.あなたはスーパーフィールドのスーパークラスの名前を入力するか、またはフィールドの横にある小さな“鉛筆”ボタンのアイコンをクリックしてクラスを選択することができます選択スーパークラスウィンドウを表示することができます.

  • 既存のクラスからのスーパークラスの作成


    あなたが決定した既存のクラスが本当にサブクラスでなければならないならば、あなたはそれからスーパークラスをつくることができます.クラスのコンテキストメニューを使用し、「Extract SuperClass」を選択します.これにより、スーパークラスの名前を指定し、クラスからスーパークラスへ移動するメソッドとプロパティを選択できるウィンドウが開きます.
    既存のサブクラスからスーパークラスを抽出すると、古いクラスと現在のサブクラスの間に新しいクラスが追加されます.

    仮想メソッド(オーバーライド)


    仮想メソッドは、サブクラスがスーパークラスが持つメソッドの独自のバージョンをオーバーライドする方法を提供します.通常、サブクラスは親に属するメソッドを継承します.
    サブクラスがスーパークラスのメソッドとして同じ名前(およびパラメーター)を持つメソッドを持つ場合、サブクラスメソッドが呼び出されます.これは“override”と呼ばれます.スーパークラスのメソッドを呼び出すには、メソッドコールを使ってスーパープレフィックスを特別にコールすることによって、
    Super.MethodName
    

    多型


    多形は、完全に異なるデータ型(一般的にはクラス)を一様に振る舞う能力です.継承とオーバーライド、継承、イベント、クラスインターフェイスを使用してこれを行うことができます(後述の記事で説明します).
    これの単純な例は、動物、猫と犬の関係です.あなたがどのように“ニャー”を話すかを知っている一般的な動物のオブジェクトを持っている場合または“woof!”それが実際に猫か犬かどうかに応じて、あなたは継承とオーバーライドを使用してそれを実装できました.
    まず、Animalという新しいクラスを作成します.テキストを返すSpeakメソッドを追加します.ここでcatという動物のサブクラスを作ります.テキストを返すSpeakメソッドを追加します.これは、あなたが動物で未実装のSpeakメソッドを上書きしていることを意味します.このメソッドのコードは次のとおりです.
    Return "Meow!"
    
    次に、犬という動物の別のサブクラスを作成します.このコードでテキストを返すSpeakメソッドを追加します.
    Return "Woof!"
    
    これをテストするには、レイアウトにボタンを追加します.ボタンのアクションイベントで、コードを追加して、配列の配列を作成して、Sequenceメソッドを呼び出して配列をループします.
    Dim animals() As Animal
    animals.Append(New Cat)
    animals.Append(New Dog)
    For Each a As Animal In animals
      MsgBox(a.Speak)
    Next
    
    このコードを実行すると、「ニャー」と表示されますそれから“woof!”ネコと犬は動物の両方のサブクラスであるので、彼らは一種の動物で変数(動物配列)に割り当てられるのを許されます.それで、動物は猫か犬でありえます.
    そして、あなたがPolymerのために(ループで)動物のSpeakメソッドを呼ぶとき、あなたのコードは、配列に加えられた実際のサブクラスタイプのSpeakメソッドを呼び出します.後のセクションでは、イベントとクラスインターフェイスを使用して継承を使用して同じことを達成する方法を示します.