10

私は工場を持っています。このファクトリが生成するクラスがファクトリの外でインスタンス化されることを許可したくありません。それらを抽象化、静的にするか、プライベートコンストラクターを与えると、インスタンス化できなくなります! これは言語の制限ですか、それとも何ですか?

これは許したくない

var awcrap = new Extrude2013 (); // BAD !!!
awcrap.extrudify (); // I don't want to allow this

コードの残りの部分:

using System;

namespace testie
{
    public enum ExtrudeType { Extrude2013,  Extrude2014 }

    public interface IExtrudeStuff {
        void extrudify();
    }

    public class Extrude2013 : IExtrudeStuff { 
        public void extrudify(){ 
            Console.WriteLine ("extrudify 2013");
        }
    }

    public class Extrude2014 : IExtrudeStuff { 
        public void extrudify(){ 
            Console.WriteLine ("extrudify 2014");
        }
    }
    public static class ExtrudeFactory {
        public static IExtrudeStuff Create(ExtrudeType t) {
            switch (t) {
                case ExtrudeType.Extrude2013: return new Extrude2013 ();
                case ExtrudeType.Extrude2014: return new Extrude2014 ();
                default: return null; 
            } 
        }
    }

    class MainClass {
        public static void Main (string[] args) {
            // Now for the pretty API part
            var o = ExtrudeFactory.Create (ExtrudeType.Extrude2013);
            o.extrudify ();
            var p = ExtrudeFactory.Create (ExtrudeType.Extrude2014);
            p.extrudify ();

            var awcrap = new Extrude2013 (); // BAD !!!
            awcrap.extrudify (); // I don't want to allow this
        }
    }
}
4

2 に答える 2

7

これを完全に禁止することはできません。それが言語の「制限」であるかどうかは意見の問題ですが、次の点を考慮することができます。

  • コンストラクタを作成しinternalます。これにより、宣言アセンブリ内の任意の型がコンストラクターを呼び出すことができますが、アセンブリの外では何も呼び出せません。これは、そのアセンブリに記述したすべてのコードがファクトリの呼び出しを担当することを意味し、コンストラクターを呼び出すことができないため、別のアセンブリでクラスのサブタイプを宣言できないことも意味します。
  • 同様のアプローチは、抽象クラス(またはインターフェース) を公開するクラスを作成し、抽象クラスまたはインターフェースを実装する型を宣言するinternal(またはprivate、ファクトリの外部で参照されることはないため、ファクトリのサブクラスとしても宣言する) ことです。 .
  • ファクトリのみがコンストラクターで提供できるトークンを要求します。これがDataTableクラスの仕組みです。コンストラクターを呼び出すことはできますが、ユーザーはnull値を渡す必要があり、少なくともこれを行うべきではないことは明らかです。
于 2013-10-07T16:13:48.137 に答える