7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

本当の継承シングルトンを見せてやんよ【C#】

Posted at

今回は,継承可能なシングルトン,つまり,この抽象クラスを継承すればなんでもシングルトンになれるぜ〜ってクラスを紹介します。

継承ツリーという概念と、みんな大好きジェネリックが出てきます。

誰しも一回は通る道

public abstract class BaseSingleton<T>
{
    public static T Instance;

    public BaseSingleton()
    {
        Instance = (T)this;
    }
}

public class Singleton : BaseSingleton<Singleton> { }

これじゃコンパイラーは通しちゃくれません。なぜでしょうか。

Cannot convert type 'BaseSingleton<T>' to 'T'.

Instance = (T)this;のところでひっかっています。これはObject => BaseSingleton<T>Object => Tという二つの継承ツリーが存在しており、言語仕様として別ツリーにはキャストできないからです。つまり、TBaseSingleton<T>の関係を教えてやればいいのです。

結論

正解は、これ。

public abstract class BaseSingleton<T> where T : BaseSingleton<T>
{
    public static T Instance;

    public BaseSingleton()
    {
        Instance = (T)this;
    }
}

public class Singleton : BaseSingleton<Singleton> { }

where節により、継承関係が明示されました。
継承ツリーはObject => BaseSingleton<T> => Tとなっており、これならキャスト可能です。

余談: UnityのMonoBehaviourをシングルトンにしてみる

同じように。

public abstract class SingletonBehaviour<T> : MonoBehaviour where T : SingletonBehaviour<T>
{
    public static T instance;

    public SingletonBehaviour()
    {
        instance = (T)this;
    }

    private protected virtual void OnDestroy()
    {
        instance = null;
    }
}

まとめ

ジェネリックってほんとにムズカシイ!けどめっちゃ楽しい!

7
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?