滅入るんるん

何か書きます

Kotlin使いのためのC#入門 Classes and Inheritance

> Top

Classes

C#もKotlinと同じようにclassの宣言をしますが、ブロック無しのclass宣言はできません。

class Value { }

Constructors

Kotlinにはprimary constructorとsecondary constructorの概念がありますが、C#はconstructorを分類分けするような概念はありません。

また、Kotlinにはconstructorの後に初期化としてinitブロックがありますが、C#にはないのでコンストラクターに処理を書くか、初期化用メソッドを作りそれをコンストラクターで呼び出す必要があります。

class Value
{
    // 型と同じ名前のメソッドのようなブロックがコンストラクターとなる
    public Value(int value)
    {

    }

    public Value(uint value)
    {

    }
}

Kotlinのようにコンストラクターの引数でプロパティを宣言することはできません。

Secondary Constructors

Kotlinの: this()による他のコンストラクター呼び出しはC#にもあります。

class Value
{
    // 型と同じ名前のメソッドのようなブロックがコンストラクターとなる
    public Value(int value)
    {

    }

    public Value(uint value) : this((int)value)
    {

    }
}

Creating instances of classes

Kotlinではインスタンス作成にnew演算子は必要ありませんが、C#ではnew演算子によってインスタンスを作成します。構造体や配列の場合でも同じです

class CreateInstance
{
    public Value Create()
    {
        return new Value(1);
    }
}

Class Members

C#のクラスのメンバーには以下の要素を含めます。

  • コンストラクター
  • デストラクター
  • メソッド
  • プロパティ
  • フィールド
  • デリゲート
  • イベント
  • インデクサー
  • 演算子のオーバーロード

また、インナーとして型を持つこともできます。

Kotlinには全くない機能としてはフィールドとデリゲートとイベントが挙げられるでしょう。

Inheritance

Kotlinではプロパティ型を除くすべての型はAnyを継承しています。C#では構造体や基本データ型なども含めすべての方はobjectを継承しています。

また、用語の違いとしてC#では継承元の型を基底クラス、継承先の型を派生クラスと呼びます。

Kotlinではデフォルトでクラスは派生を認めていません。open修飾子を付けることで継承が可能になります。 C#はその逆でデフォルトでクラスの派生を認めています。sealed修飾子を付けることで継承を不可能にします。

sealed class Value { }

// コンパイルエラー: sealed修飾子が付いてるので継承できない
class KeyValuePair : Value { }

基底クラスのコンストラクターを呼ぶ際は、: base()で呼び出すことができます。また、引数がある場合やコンストラクターが複数ある場合は、派生クラスのコンストラクターは基底クラスのコンストラクターを呼び出す必要があります。

class Value
{
    public Value() { }
}

class KeyValuePair: Value
{
    public KeyValuePair() : base() { }
}

Overriding Methods

Kotlinではopen修飾子をメソッドに付けることによって、仮想メソッドとなり、メソッドをオーバーライドすることができました。 C#も同じようにvirtual修飾子をメソッドに付けることによって、仮想メソッドとなり、メソッドをオーバーライドすることができます。

また、オーバーライドをさせないためにsealed修飾子を付けることもできます。

class Value
{
    public virtual void Main() { }
}

class KeyValuePair : Value
{
    public override void Main()
    {
        base.Main();
    }
}

class ValuesPair : KeyValuePair
{
    public sealed override void Main()
    {
        base.Main();
    }
}

class Values : ValuesPair
{
    // コンパイルエラー: sealedされてるのでオーバーライドできない
    public override void Main()
    {
        base.Main();
    }
}

Overriding Properties

C#もKotlinと同じようにプロパティをオーバーライドすることができます。

class Value
{
    public virtual string Text { get; }
}

class KeyValuePair : Value
{
    public override string Text { get; }
}

class ValuesPair : KeyValuePair
{
    public sealed override string Text { get; }
}

class Values : ValuesPair
{
    // コンパイルエラー: sealedされてるのでオーバーライドできない
    public override string Text { get; }
}

しかし、getter onlyなプロパティにsetterを生やすことはできないです。

Derived class initialization order

大差ないので割愛。

Calling the superclass implementation

たびたび登場したbaseによって呼び出せるので割愛。

Overriding Rules

直接的には関係ないですが、C#ではinterfaceの明示的な実装ができます。明示的な実装をした場合はその型にキャストしてからでないと呼び出すことができません。

class Value : IValue
{
    public void Main() { }

    void IValue.Main() { }
}

interface IValue
{
    void Main();
}

Abstract Classes

まったく同じなので割愛。

Companion Objects

C#にはcompanion objectやobjectといった概念がありません。 同じようにするにはstatic修飾子を付けて静的フィールド/プロパティ/メソッドなどにする必要があります。

また、C#のstatic classはJavaのstatic classと意味が異なり、C#のstatic classは単にclassのメンバーにstatic修飾子を強制させる機能です。