オブジェクト指向プログラミング (C# および Visual Basic)

.NET Framework では、Visual Basic や C# などのすべてのマネージ言語で、カプセル化、継承、ポリモーフィズムなどのオブジェクト指向プログラミングが完全にサポートされています。

カプセル化とは、関連するプロパティ、メソッド、およびその他のメンバーのグループが 1 つの単位またはオブジェクトとして扱われることを意味します。

継承は、既存のクラスに基づいて新しいクラスを作成する機能です。

ポリモーフィズムを採用すると、複数のクラスがあり、各クラスが同一プロパティや同一メソッドを異なる方法で実装していたとしても、交換して使用できます。

このセクションでは、次の概念について説明します。

  • クラスとオブジェクト

    • クラス メンバー

      プロパティとフィールド

      メソッド

      コンストラクター

      デストラクター

      イベント

      入れ子になったクラス

    • アクセス修飾子とアクセス レベル

    • クラスのインスタンス化

    • 静的 (共有) クラスおよびメンバー

    • 匿名型

  • 継承

    • メンバーのオーバーライド
  • インターフェイス

  • ジェネリック

  • デリゲート

クラスとオブジェクト

クラスという用語とオブジェクトという用語は同じ意味で使用される場合がありますが、実際には、クラスはオブジェクトの型を表すのに対し、オブジェクトはクラスの使用可能なインスタンスです。 そのため、オブジェクトを作成する操作はインスタンス化と呼ばれます。 設計図との対比を使って説明すると、クラスは設計図であり、オブジェクトはその設計図を基にした建築物です。

クラスを定義するコード例を次に示します。

Class SampleClass
End Class
class SampleClass
{
}

Visual Basic と C# には、構造体と呼ばれる軽量バージョンのクラスも用意されています。構造体は、大きいオブジェクト配列を作成する必要があり、その配列に使用されるメモリの量を抑えたい場合に役立ちます。

構造体を定義するコード例を次に示します。

Structure SampleStructure
End Structure
struct SampleStruct
{
}

詳細については、次のトピックを参照してください。

クラス メンバー

各クラスには、さまざまなクラス メンバーを含めることができます。クラス メンバーには、クラスのデータを記述するプロパティ、クラスの動作を定義するメソッド、異なるクラスやオブジェクト間で通信するためのイベントが含まれます。

プロパティとフィールド

フィールドとプロパティは、オブジェクトに格納されている情報を表します。 フィールドは、直接読み取ったり設定したりできるので変数と似ています。

フィールドを定義するコード例を次に示します。

Class SampleClass
    Public SampleField As String
End Class
Class SampleClass
{
    public string sampleField;
}

プロパティには get プロシージャと set プロシージャがあり、これらを使用することで値の設定方法や戻り値をより細かく制御できます。

C# と Visual Basic のどちらでも、プロパティ値を格納するプライベート フィールドを作成するか、または自動実装プロパティと呼ばれる手法を使用できます。自動実装プロパティでは、値を格納するフィールドが背後で自動的に作成され、プロパティ プロシージャの基本的なロジックが提供されます。

自動実装プロパティを定義するコード例を次に示します。

Class SampleClass
    Public Property SampleProperty as String
End Class
class SampleClass
{
    public int SampleProperty { get; set; }
}

プロパティ値の読み取りと書き込みのために追加の操作を実行する必要がある場合は、プロパティ値を格納するフィールドを定義し、値を格納および取得する基本的なロジックを実装します。

Class Samplelass
    Private m_Sample As String
    Public Property Sample() As String
        Get
            ' Return the value stored in the field.
            Return m_Sample
        End Get
        Set(ByVal Value As String)
            ' Store the value in the field.
            m_Sample = Value
        End Set
    End Property
End Class
class SampleClass
{
    private int _sample;
    public int Sample
    {
        // Return the value stored in a field.
        get { return _sample; }
        // Store the value in the field.
        set { _sample = value; }
    }
}

ほとんどのプロパティには、プロパティ値の設定と取得を行うための両方のメソッドまたはプロシージャがあります。 ただし、読み取り専用または書き込み専用のプロパティを作成して、プロパティの変更や読み取りを制限することもできます。 そのためには、Visual Basic では ReadOnly キーワードと WriteOnly キーワードを使用します。 C# では、get プロパティ メソッドまたは set プロパティ メソッドを省略します。 ただし、Visual Basic でも C# でも、自動実装プロパティを読み取り専用または書き込み専用にすることはできません。

詳細については、次のトピックを参照してください。

メソッド

メソッドは、オブジェクトが実行できる処理です。

注意

Visual Basic には、メソッドを作成する方法が 2 つあります。メソッドが値を返さない場合は Sub ステートメントを使用し、メソッドが値を返す場合は Function ステートメントを使用します。

クラスのメソッドを定義するコード例を次に示します。

Class SampleClass
    Public Function SampleFunc(ByVal SampleParam As String)
        ' Add code here
    End Function
End Class
class SampleClass
{
    public int sampleMethod(string sampleParam)
    {
        // Insert code here
    }
}

クラスには、同じメソッドに対して、パラメーターの数やパラメーターの型が異なる複数の実装 (オーバーロード) を含めることができます。

メソッドをオーバーロードするコード例を次に示します。

Overloads Sub Display(ByVal theChar As Char)
    ' Add code that displays Char data.
End Sub
Overloads Sub Display(ByVal theInteger As Integer)
    ' Add code that displays Integer data.
End Sub
public int sampleMethod(string sampleParam) {};
public int sampleMethod(int sampleParam) {}

ほとんどの場合、メソッドはクラス定義内で宣言します。 ただし、Visual Basic でも C# でも、既存のクラスの実際の定義の外部にメソッドを追加できる拡張メソッドがサポートされています。

詳細については、次のトピックを参照してください。

コンストラクター

コンストラクターは、特定の型のオブジェクトを作成するときに自動的に実行されるクラス メソッドです。 コンストラクターは、通常、新しいオブジェクトのデータ メンバーを初期化します。 コンストラクターは、クラスの作成時に 1 回だけ実行できます。 また、コンストラクター内のコードは常に、クラス内の他のすべてのコードより先に実行されます。 他のメソッドと同じように、コンストラクターにも複数のオーバーロードを作成できます。

クラスのコンストラクターを定義するコード例を次に示します。

Class SampleClass
    Sub New(ByVal s As String)
        // Add code here.
    End Sub
End Class
public class SampleClass
{
    public SampleClass()
    {
        // Add code here
    }
}

詳細については、次のトピックを参照してください。

デストラクター

デストラクターは、クラスのインスタンスを消滅させるために使用します。 .NET Framework では、アプリケーション内のマネージ オブジェクトのメモリの割り当てと解放は、ガベージ コレクターによって自動的に管理されます。 ただし、アプリケーションで作成されるアンマネージ リソースを適切にクリーンアップするために、デストラクターも必要になることがあります。 1 つのクラスに定義できるデストラクターは 1 つだけです。

.NET Framework のデストラクターおよびガベージ コレクションの詳細については、「ガベージ コレクション」を参照してください。

イベント

クラスやオブジェクトは、何か重要なことが起こった場合に、イベントを使用して他のクラスまたはオブジェクトに通知を送ります。 イベントを送信する (発生させる) クラスをパブリッシャー、イベントを受信する (処理する) クラスをサブスクライバーと呼びます。 イベント、およびイベントの発生と処理の詳細については、「イベントの処理と発生」を参照してください。

入れ子になったクラス

別のクラス内で定義されているクラスを入れ子になったクラスと呼びます。 既定では、入れ子になったクラスはプライベートです。

Class Container
    Class Nested
    ' Add code here.
    End Class
End Class
class Container
{
    class Nested
    {
        // Add code here.
    }
}

入れ子になったクラスのインスタンスを作成するには、コンテナー クラスの名前に続けて、ドットと入れ子になったクラスの名前を指定します。

Dim nestedInstance As Container.Nested = New Container.Nested()
Container.Nested nestedInstance = new Container.Nested()

アクセス修飾子とアクセス レベル

すべてのクラスおよびクラス メンバーでは、アクセス修飾子を使用して、他のクラスに提供するアクセス レベルを指定できます。

次のアクセス修飾子を使用できます。

Visual Basic の修飾子

C# の修飾子

定義

Public (Visual Basic)

public

この型またはメンバーには、同じアセンブリ内の他のコードや、そのアセンブリを参照する別のアセンブリ内の任意のコードからアクセスできます。

Private (Visual Basic)

private

この型またはメンバーには、同じクラスのコードのみがアクセスできます。

Protected (Visual Basic)

protected

この型またはメンバーには、同じクラスまたは派生クラスのコードのみがアクセスできます。

Friend (Visual Basic)

internal

この型またはメンバーには、同じアセンブリ内の任意のコードからアクセスできますが、別のアセンブリからはアクセスできません。

Protected Friend

protected internal

この型またはメンバーには、同じアセンブリ内の任意のコード、または別のアセンブリ内の任意の派生クラスからアクセスできます。

詳細については、「Visual Basic でのアクセス レベル」および「アクセス修飾子 (C# プログラミング ガイド)」を参照してください。

クラスのインスタンス化

オブジェクトを作成するには、クラスをインスタンス化する (クラスのインスタンスを作成する) 必要があります。

Dim sampleObject as New SampleClass()
SampleClass sampleObject = new SampleClass();

クラスをインスタンス化した後は、インスタンスのプロパティやフィールドに値を割り当てたり、クラスのメソッドを呼び出したりできます。

' Set a property value.
sampleObject.SampleProperty = "Sample String"
' Call a method.
sampleObject.SampleMethod()
// Set a property value.
sampleObject.sampleProperty = "Sample String";
// Call a method.
sampleObject.sampleMethod();

クラスのインスタンス化のプロセスでプロパティに値を割り当てるには、オブジェクト初期化子を使用します。

Dim sampleObject = New SampleClass With 
    {.FirstProperty = "A", .SecondProperty = "B"}
// Set a property value.
SampleClass sampleObject = new SampleClass 
    { FirstProperty = "A", SecondProperty = "B" };

詳細については、次のトピックを参照してください。

静的 (共有) クラスおよびメンバー

クラスの静的メンバー (Visual Basic では共有メンバー) は、クラスのすべてのインスタンスで共有されるプロパティ、プロシージャ、またはフィールドです。

静的 (共有) メンバーを定義するコード例を次に示します。

Class SampleClass
    Public Shared SampleString As String = "Sample String"
End Class
static class SampleClass
{
    public static string SampleString = "Sample String";
}

静的 (共有) メンバーにアクセスするには、クラスのオブジェクトを作成せずにクラスの名前を使用します。

MsgBox(SampleClass.SampleString)
Console.WriteLine(SampleClass.SampleString);

C# の静的 (共有) クラスおよび Visual Basic の静的 (共有) モジュールには静的 (共有) メンバーだけが含まれ、これらをインスタンス化することはできません。 また、静的 (共有) メンバーから、非静的 (非共有) のプロパティ、フィールド、またはメソッドにアクセスすることもできません。

詳細については、次のトピックを参照してください。

匿名型

匿名型を使用すると、データ型のクラス定義を記述せずにオブジェクトを作成できます。 クラスは、コンパイラによって生成されます。 このクラスには使用可能な名前がなく、オブジェクトの宣言時に指定したプロパティが格納されます。

匿名型のインスタンスを作成するコード例を次に示します。

' sampleObject is an instance of a simple anonymous type.
Dim sampleObject = 
    New With {Key .FirstProperty = "A", .SecondProperty = "B"}
// sampleObject is an instance of a simple anonymous type.
var sampleObject = 
    new { FirstProperty = "A", SecondProperty = "B" };

詳細については、次のトピックを参照してください。

継承

継承を使用すると、他のクラスで定義されている動作を再利用、拡張、および変更する新しいクラスを作成できます。 メンバーが継承される側のクラスを基本クラスと呼び、メンバーを継承する側のクラスを派生クラスと呼びます。 ただし、C# と Visual Basic のすべてのクラスは、.NET のクラス階層構造をサポートしてすべてのクラスに下位レベルのサービスを提供する Object クラスを暗黙的に継承します。

注意

.NET Framework のマネージ言語では、多重継承はサポートされません。つまり、 派生クラスの基本クラスは 1 つしか指定できません。

基本クラスを継承するコード例を次に示します。

Class DerivedClass
    Inherits BaseClass
End Class
class DerivedClass:BaseClass{}

既定では、すべてのクラスが継承可能になります。 ただし、クラスを基本クラスとして使用できないように指定したり、基本クラスとしてのみ使用できるクラスを作成したりできます。

クラスを基本クラスとして使用できないように指定する方法を次に示します。

NotInheritable Class SampleClass
End Class
public sealed class A { }

クラスが基本クラスとしてのみ使用され、インスタンス化できないように指定する方法を次に示します。

MustInherit Class BaseClass
End Class
public abstract class B { }

詳細については、次のトピックを参照してください。

メンバーのオーバーライド

既定では、派生クラスは基本クラスのすべてのメンバーを継承します。 継承したメンバーの動作を変更する場合は、そのメンバーをオーバーライドする必要があります。 つまり、派生クラスに、メソッド、プロパティ、またはイベントの新しい実装を定義できます。

プロパティやメソッドのオーバーライド方法を制御するには、次の修飾子を使用します。

Visual Basic の修飾子

C# の修飾子

定義

Overridable (Visual Basic)

virtual (C# リファレンス)

派生クラスでのクラス メンバーのオーバーライドを許可します。

Overrides (Visual Basic)

override (C# リファレンス)

基本クラスで定義されている仮想メンバー (オーバーライドできるメンバー) をオーバーライドします。

NotOverridable (Visual Basic)

サポートなし

継承するクラスでのメンバーのオーバーライドを禁止します。

MustOverride (Visual Basic)

abstract (C# リファレンス)

派生クラスでのクラス メンバーのオーバーライドを必須にします。

Shadows (Visual Basic)

new 修飾子 (C# リファレンス)

基本クラスから継承されたメンバーを隠ぺいします。

インターフェイス

インターフェイスは、クラスと同様にプロパティ、メソッド、およびイベントのセットを定義します。 ただし、クラスとは異なり、インターフェイスは実装を提供しません。 インターフェイスはクラスによって実装され、クラスとは別のエンティティとして定義されます。 インターフェイスを実装するクラスは、そのインターフェイスのあらゆる機能を定義に従って厳密に実装する必要があります。この点で、インターフェイスはコントラクトを表しています。

インターフェイスを定義するコード例を次に示します。

Public Interface ISampleInterface
    Sub DoSomething()
End Interface
interface ISampleInterface
{
    void doSomething();
}

クラスにインターフェイスを実装するコード例を次に示します。

Class SampleClass
    Implements ISampleInterface
    Sub doSomething
        ' Method implementation.
    End Sub
End Class
class SampleClass : ISampleInterface
{
    void ISampleInterface.SampleMethod()
    {
        // Method implementation.
    }
}

詳細については、次のトピックを参照してください。

ジェネリック

.NET Framework のクラス、構造体、インターフェイス、およびメソッドは、格納または使用できるオブジェクトの型を定義する型パラメーターを持つことができます。 ジェネリックの最も一般的な例として、コレクションがあります。コレクションには、その中に格納されるオブジェクトの型を指定できます。

ジェネリック クラスを定義するコード例を次に示します。

Class SampleGeneric(Of T)
    Public Field As T
End Class
Public class SampleGeneric<T> 
{
    public T Field;
}

ジェネリック クラスのインスタンスを作成するコード例を次に示します。

Dim sampleObject As New SampleGeneric(Of String)
sampleObject.Field = "Sample string"
SampleGeneric<string> sampleObject = new SampleGeneric<string>();
sampleObject.Field = "Sample string";

詳細については、次のトピックを参照してください。

デリゲート

デリゲートは、メソッド シグネチャを定義する型であり、互換性のあるシグネチャを持つ任意のメソッドへの参照を提供できます。 メソッドは、デリゲートを使用して起動する (呼び出す) ことができます。 デリゲートは、他のメソッドへの引数としてメソッドを渡すために使用されます。

注意

イベント ハンドラーは、デリゲートを介して呼び出されるメソッドにすぎません。 デリゲートを使用したイベント処理の詳細については、「イベントとデリゲート」を参照してください。

デリゲートを作成するコード例を次に示します。

Delegate Sub SampleDelegate(ByVal str As String)
public delegate void SampleDelegate(string str);

デリゲートで指定されたシグネチャに一致するメソッドへの参照を作成するコード例を次に示します。

Class SampleClass
    ' Method that matches the SampleDelegate signature.
    Sub SampleSub(ByVal str As String)
        ' Add code here.
    End Sub
    ' Method that instantiates the delegate.
    Sub SampleDelegateSub()
        Dim sd As SampleDelegate = AddressOf SampleSub
        sd("Sample string")
    End Sub
End Class
class SampleClass
{
    // Method that matches the SampleDelegate signature.
    public static void sampleMethod(string message)
    {
        // Add code here.
    }
    // Method that instantiates the delegate.
    void SampleDelegate()
    {
        SampleDelegate sd = sampleMethod;
        sd("Sample string");
    }
}

詳細については、次のトピックを参照してください。

参照

概念

C# プログラミング ガイド

その他の技術情報

Visual Basic のプログラミング ガイド