かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

ポリシーベースのクラスの設計?

Modern C++ Designにある、C++のポリシーベースのクラス設計。
ポリシークラス - (hatena (diary ’Nobuhisa))」ここに触発されてC#でやるとしたら…と考えてたらこうなった。
C#3.0

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Policy
{
    class Program
    {
        static void Main(string[] args)
        {
            Manager m1 = new Manager{ Policy = new Policy1<Person>() };
            Manager m2 = new Manager{ 
                             Policy = new Policy2<Person>(new Person { 
                                                              Message = "はろう" }) };
            m1.Create().Greet();
            m2.Create().Greet();
        }
    }

    class Person : ICloneable
    {
        public string Message { get; set; }

        public Person() { Message = "Hello world"; }

        public void Greet() { Console.WriteLine(Message); }

        public object Clone()
        {
            return new Person { Message = this.Message };
        }
    }

    interface IPolicy<T>
    {
        T CreateInstance();
    }

    class Policy1<T> : IPolicy<T>
        where T : new()
    {

        #region IPolicy<T> Members

        public T CreateInstance()
        {
            return new T();
        }

        #endregion
    }

    class Policy2<T> : IPolicy<T>
        where T : ICloneable
    {
        private T instance;

        public Policy2(T instance)
        {
            this.instance = instance;
        }

        public T CreateInstance()
        {
            return (T) instance.Clone();
        }
    }

    

    class Manager
    {
        private IPolicy<Person> policy;

        public IPolicy<Person> Policy
        {
            get { return policy; }
            set { policy = value; }
        }

        public Person Create()
        {
            return policy.CreateInstance();
        }
    }
}

実行結果は↓

Hello world
はろう


C++のtemplateみたいに強力なのがC#には無いんで、結局のところStrategy patternを使うようになるかな…
面白くもなんとも無いことになってしまいました!