クラス (コンピューター サイエンス)について詳しく解説

オブジェクト指向プログラミングでは、クラスはオブジェクトのセットに共通のプロパティを宣言します。このクラスは、オブジェクトの状態を表す属性と、その動作を表すメソッドを宣言します。

したがって、クラスはオブジェクトのカテゴリを表します。また、オブジェクトを作成できる金型または工場としても表示されます。次に、オブジェクトをクラスのインスタンスとして話します (クラスのプロパティを持つオブジェクトの作成)。

継承メカニズムを使用して、クラス A によって表されるオブジェクトのセットを制限することができます。この場合、クラス A にリンクされた新しいクラス B を作成し、新しいプロパティを追加します。この場合、次のような異なる用語が使用されます。

  • A は B の一般化であり、B は A の特殊化です。
  • A は B のスーパークラスであり、B は A のサブクラスです。
  • A は B の親クラスであり、B は A の子クラスです。

クラスの例

以下の例では、2 つの属性xyを持つPointクラスが異なる言語で定義されています。このクラスには、コンストラクター、属性値を返す 2 つのメソッド ( getX()およびgetY() )、点が原点を表すかどうかを決定するメソッド ( isOrigin() )、および変換を実行するメソッドが含まれています。

  • C++の場合
クラスポイント{
保護されています:
int x;
int y;
観客:
ポイント(int x, int y) {
これ->x = x;
this->y = y;
}
int getX() { 戻り値 x; }
int getY() { y を返します。 }
bool isOrigin() { return (x == 0) && (y == 0); }
ポイント&移動(ポイントポイント) {
ポイント* newPoint = 新しいポイント(x + point.x, y + point.y);
*newPoint を返します。
}
};
  • Javaでは
パブリック クラス ポイント {
// 属性の宣言
int x;
int y;
// コンストラクター: クラスの初期化を定義します。
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() { return x; }
public int getY() { y を返します。 }
public boolean isOrigin() { return (x == 0) && (y == 0); }
public Point translation(Point point) {
新しい Point(x + point.x, y + point.y) を返します。
}
}
  • Pythonで
クラスアイテム:
def __init__(self, x, y):
self.x = x
self.y = y
def getX(self): self.x を返す
def getY(self): self.y を返す
def isOrigin(self):
return (self.x == 0) および (self.y == 0)
def translation(self, point):
return Point(self.x + point.x, self.y + point.y)
クラス (コンピューター サイエンス)について詳しく解説

特別クラスのケース

抽象クラス

一部の言語では、クラスを部分的に定義できます。特に、このクラスの一部のメソッドには本体または実装がありません。これらのメソッドは抽象(C++ では仮想) と呼ばれます。

少なくとも 1 つの抽象メソッドを持つクラスは抽象 (または仮想) クラスとも呼ばれ、非抽象サブクラスを作成する場合を除き、直接インスタンス化することはできません。

例:ベクトル描画のオブジェクトの関係をモデル化したいと考えています。描画オブジェクトはジオメトリのセット (抽象クラス) であり、各ジオメトリは点、多角形、または破線にすることができます (これら 3 つのクラスはジオメトリを継承します)。したがって、抽象クラスはそれ自体は必須ではありませんが、クリーンで汎用的で単純化されたモデルには不可欠です[ 1 ]

mixin は抽象クラスの特殊なケースです。これにより、サービスをサブクラスに追加できます。

インタフェース

抽象メソッドのみを持つクラスは、インターフェイス、純粋仮想クラス (C++ の場合)、またはプロトコル (Objective C の場合) と呼ばれます。

クラス (コンピューター サイエンス)について詳しく解説

メタクラス

クラスのクラスはメタクラスです。メタクラスを使用すると、構造的な思考が可能になります。

会員データの取り扱い

クラスのメンバーへのアクセス

前に定義したように、クラスは、必然的に操作する必要がある型付きメンバー (メソッドと属性) のセットです。 p がPoint(a,b)のインスタンスであり、 abint型である場合、次のようにpのメンバーにアクセスします。

  • px = aおよびpy = b (属性へのアクセス)
  • p.getX()およびp.getY() (メソッドアクセス)

すぐに頭に浮かぶ疑問は、 Pointクラスのxフィールドとyフィールドに直接アクセスできるのに、なぜgetX()メソッドを定義するのかということです。

実際、多数のクラスやそれらのクラス間の多数の関係 (継承を参照) を操作する必要がある場合、スキーマ、データ、操作は非常に複雑になる可能性があります (特にコードを設計したことがない個人にとって)。したがって、整合性を保つために、プログラムの特定の部分からクラス フィールドを隠す役割を果たすデータカプセル化と呼ばれるメカニズムを使用します。したがって、ユーザーは、承認され、理論上その役割を十分に果たせるメソッドのみを使用する必要があります。

カプセル化の原則によれば、メソッドはパブリックアクセスを持ちます。これは、プログラムのどの要素でもメソッドを使用できることを意味します。状態を構成する属性に関しては、プライベートアクセスが可能です。オブジェクト自体 (したがってそれに含まれるメソッド) のみがその属性直接アクセスできます。この場合、これらの属性にアクセスする唯一の方法は、オブジェクトのメソッドを使用することです。たとえこのオブジェクトが同じクラスであっても、プログラムの別の要素や別のオブジェクトで属性を直接使用することはできません。もう 1 つのポイント: 継承されたオブジェクトのすべての属性には、このオブジェクトの他のメンバーが直接アクセスできます。

最後のコメントに関しては、プライベート アクセスのセマンティクスについてよく混乱があります。カプセル化の原則には、垂直方向と呼ぶ属性保護が含まれます (オブジェクト自体とサブクラスのオブジェクトのみがそれにアクセスできます)。このセマンティクスは、 Smalltalk 、Oz、OCaml などの言語で見られます。ただし、C++ や Java などの特定の言語では、水平(同じクラスのオブジェクトはアクセスできますが、サブクラスのオブジェクトはアクセスできません) と呼ぶ属性保護を提唱しています。

クラスメンバーへのアクセスと可視性の制御

一部の言語では、オブジェクトのメンバーのアクセス タイプを変更できます。この操作は、これらのオブジェクトのクラス内で実行されます。たとえば、C++ では次の可視性が提供されます。

  • public : メンバーはプログラム内で、またはプログラムの任意の部分で使用できます (この方法で定義されたメソッドはユーザーに表示され、使用可能です)。
  • private : クラスのプライベートメンバーは、まさにこのクラスのオブジェクトからのみアクセスでき、子クラスや別のクラスのオブジェクトからはアクセスできません。
  • protected : プライベート メンバーと似ていますが、子クラス使用できます。

これらの可視性のセマンティクスとその数は言語によって異なります。たとえば、Java では、保護されたメンバーに対して少し異なる定義が提供されています (同じクラスのすべてのオブジェクト、子クラス、および同じパッケージのクラスに拡張されます)。 Python では、メンバー名の前にアンダースコア文字 (‘_’) を付けることで、クラスのメンバーの可視性を変更する機能も提供します。たとえば、 getX() はパブリック メソッドであり、 _getX()は同じモジュールの要素でのみ使用でき、 __getX()はプライベート メソッドです。

演算子のオーバーロード

参照: 演算子のオーバーロード

同じタイプのデータを操作する必要がある場合 (たとえば、座標系内の点の場合)、これらのオブジェクトに (OOP の意味で) 操作を適用したい場合があります。したがって、2 つの点を加算すると新しい点が得られるのと同様に、2 つのゾーン (ポリゴン) を結合すると新しいゾーンが得られます。

  • ポイントを追加する場合、最初のメソッドは、translate(Point)と呼ばれる Point クラスのメンバー メソッドを作成することで構成され、追加後の新しい Point を返します。我々は持っています:
...
p=ポイント(6,2)
q=点(6,3)
m=ポイント(0,0)
m=p.translate(q) // p+q
...
  • 実際、より自然でより単純な表記法は、単純にm = p+qで加算を表すことになります。これを行うには、演算子のオーバーロードと呼ばれるメカニズムを使用します。これは、指定されたアクションに対して指定された演算子を再定義します[ 2 ]

Point クラスを続けましょう。次の Python の例は非常に分かりやすいです。

クラスアイテム:
(...)
def __add__(self,point): # '+' のオーバーロード
return Point(self.x + point.x, self.y + point.y)
p=ポイント(0,0)
q=点(2,3)
r=p+q

したがって、 r.getX() は2 を返します。

クラス (コンピューター サイエンス)について詳しく解説

メモと参考文献

  1. ベクトル描画は多角形、線、点のセットであると言えるでしょう。しかし、より複雑なジオメトリを追加したい場合は、親クラスの構造自体を変更する必要があることに気づきましたが、これはばかばかしいことです。
  2. 明らかに、「+」演算子をオーバーロードして、ポイントの追加以外のことを行うことができます。ただし、不適切に選択されたオーバーロードを増やすと、コードが重くなり、読みにくくなります。
  1. Klasse – afrikaans
  2. صنف (حوسبة) – arabe
  3. Sinif – azerbaïdjanais
  4. Клас (праграмаванне) – biélorusse
  5. Кляса (праграмаваньне) – Belarusian (Taraškievica orthography)
  6. Клас (програмиране) – bulgare

クラス (コンピューター サイエンス)について詳しく解説・関連動画

サイエンス・ハブ

知識の扉を開け、世界を変える。