2017-12-06 9 views
1

私はApple ClassAppleFactoryクラスを持っているとしましょう。 Apple redApple = new Apple()は誰も使用できません。代わりに新しいAppleはAppleFactory.Create()からしか作成できません。コンストラクタへのアクセスを禁止/特定のクラスのみがアクセス可能

これはAppleFactoryクラスを除くすべての人がAppleのConstructorにアクセスできなくてはならないことを意味します。

どうすればいいですか?

編集:AppleAppleModelとよく似ています。だからそこにはプロパティだけがある。

+2

あなたは、C#で利用できないC++の友人関係に類似したものを探しています。 私が意見を述べることがあれば、これについて心配するべきではありません。誰かが将来Apple自身のインスタンスを作成したい場合は、自分の問題ではなく、その問題 – LordWilmore

答えて

2

あなたは工場として機能するように異なるタイプをしたい場合は、あなたが得ることができる最も近いinternalです:

public sealed class Apple() { 
    internal Apple() {} 
} 
public class AppleFactory() { 
    public Apple CreateApple() => new Apple(); 
} 

しかし、あなたがして、Appleの静的メソッドとして工場を持つことができる場合あなたはAppleクラスは自社工場であるとすることができます

public sealed class Apple() { 
    private Apple() {} 
    public static Apple Create() => new Apple(); 
} 
+0

問題はAppleがAppleModelに似ていることです。したがって、そこにはプロパティのみがあり、実際のロジックはありません。私はむしろ工場をApple自身の中に置いてはいけません。 – Thypari

+0

@Thypari私はあなたを聞く。私はちょうどオプションが何かを教えています:)注:この 'Apple'がcode-genツールからのものである場合、' partial class'が役立つかもしれません - 別のファイルのクラスに機能を追加することができます。同様に、拡張メソッド。 –

1

Appleを抽象化してからprivateサブクラスをAppleFactoryにすることができます。

ただし、他の人が独自のサブクラスを作成することを防ぐことはできません。

1

:あなたはすべてprivateを維持することができます。

public class Apple 
{ 
    private Apple() 
    {} 

    internal static Apple Create() 
    { 
     var apple = new Apple(); 
     // TODO: Initialize 
     return apple; 
    } 
} 

本物のAppleの工場は、このファクトリメソッドを呼び出すことができます:Apple.Create()内部にすることで

public class AppleFactory() { 
    public CreateApple() => Apple.Create(); 
} 

を、現在のアセンブリにその使用を制限することができます。コンストラクタはprivateであるため、アンドAppleだけ呼び出すことができます。

+0

問題はAppleがAppleModelに似ていることです。したがって、そこにはプロパティのみがあり、実際のロジックはありません。 – Thypari

関連する問題