があるので、いくのコンストラクタにしか見えない親クラスのクライアントまで、フルのC#?

StackOverflow https://stackoverflow.com/questions/20185

  •  09-06-2019
  •  | 
  •  

質問

って収集されたクラスの継承からのクラスはabstractクラスI作成されます。お使いの抽象クラス工場として創作のインスタンスのコンクリート実装のabstractクラスです。

必要があります。隠コンストラクタからすべてのコード以外の親クラスです。

たいなって思っててこれは、基本的には

public abstract class AbstractClass
{
    public static AbstractClass MakeAbstractClass(string args)
    {
        if (args == "a")
            return new ConcreteClassA();
        if (args == "b")
            return new ConcreteClassB();
    }
}

public class ConcreteClassA : AbstractClass
{
}

public class ConcreteClassB : AbstractClass
{
}

していきたいと思ってい防止の方から直接スをインスタンス化の2コンクリート。いるためだけにMakeAbstractClass()メソッドのインスタンスを生成できるベース。はありません。

更新
んへのアクセスの具体的な方法のConcreteClassAは外部からの抽象クラスです。私だけでは、publicメソッドは私の抽象クラスを提供します。んですように予防する必要があったため、コンクリートの授業からのインスタンスが生成され、私は回避しようとするとして提供されていない新しい公開インターフェースは、異なる実装の特定のものの内部にはabstractクラスです。

私にとっては、単純な解決策であ う児童の授業としてsamjudsonて.私はこれを避けるためにしてことができるとされていることは私の抽象クラスファイルは多くよりも大きいです。むしろい授業としているので、はほとんど変化しないファイルのための組織です。

思いが簡単な解決策です。

役に立ちましたか?

解決

しないように注意してくださいサブク子供クラスのようなこと:

public abstract class AbstractClass
{
    public static AbstractClass MakeAbstractClass(string args)
    {
        if (args == "a")
            return new ConcreteClassA();
        if (args == "b")
            return new ConcreteClassB();
    }

    private class ConcreteClassA : AbstractClass
    {
    }

    private class ConcreteClassB : AbstractClass
    {
    }
}

@Vaibhav これは実際にそのクラスも開かれています。このと認識してい唯一の方法を完全に隠蔽しのコンストラクタです。

編集:していて同じものを使用することで達成できる反射が実際に近づけることに何を残していただければ幸い場合、例えば上記の方法でご回答は、コンクリートのる授業の内側と同じファイルとしての抽象クラスは、そんなにかと便利です。ここには素敵な'ハッキング、良いる場合には、複雑さのコンクリートの授業は低い。

他のヒント

私にとっては、単純な解決策であ う児童の授業としてsamjudson 挙げられる。私はこれを避けるために しかしながら、足を使い始めて 抽象クラスファイルは多くよりも大き 思います。むしろく 授業としているので、はほとんど変化しないファイル 組織です。

問題なしでの利用 部分 キーワードは、分割することができお客様のご利用クラスとして多くのファイルをすることが出来ます。んで、同じファイルです。

前の答え:

できるだけで反射

public abstract class AbstractClass
{
    public static AbstractClass MakeAbstractClass(string args)
    {
        if (args == "a")
            return (AbstractClass)Activator.CreateInstance(typeof(ConcreteClassA), true);
        if (args == "b")
            return (AbstractClass)Activator.CreateInstance(typeof(ConcreteClassB), true);
    }
}

public class ConcreteClassA : AbstractClass
{
    private ConcreteClassA()
    {
    }
}

public class ConcreteClassB : AbstractClass
{
    private ConcreteClassB()
    {
    }
}

こちらには別のパターンをなく醜い MakeAbstractClass(文字列(<%=args%>等:args)

public abstract class AbstractClass<T> where T : AbstractClass<T>
{
    public static T MakeAbstractClass()
    {
        T value = (T)Activator.CreateInstance(typeof(T), true);
        // your processing logic
        return value;
    }
}

public class ConcreteClassA : AbstractClass<ConcreteClassA>
{
    private ConcreteClassA()
    {
    }
}

public class ConcreteClassB : AbstractClass<ConcreteClassB>
{
    private ConcreteClassB()
    {
    }
}

る場合の授業の組み立てできるようにとのコンストラクタ内部?

ないというのはありえないと考えています。

下からの 受け答え, また、公開インタフェースの日本語プライベートクラスの実装インタフェースがこれを返すポインタのインタフェースにも外側の親の抽象クラスとして使用しない隠れ子のクラス).

いん 必要 するのか?使用している場合は、何らかの疑似パターン工場が成立しなければデザインすることを目的としているご利用いただけるのかをコードが維持。

必要がない場合はこのためには、実施の真の工場です。または、ALTy、DI/IoCの枠組み

できないを使用したキーワード partial 分割のためのコードクラスへの多数のファイル?

ご利用の場合はこのクラス別サービスを組み立ててしまうので、内部がキーワードとなります。

public class AbstractClass
{
    public AbstractClass ClassFactory(string args)
    {
        switch (args)
        {
            case "A":
                return new ConcreteClassA();               
            case "B":
                return new ConcreteClassB();               
            default:
                return null;
        }
    }
}

public class ConcreteClassA : AbstractClass
{
    internal ConcreteClassA(){ }
}

public class ConcreteClassB : AbstractClass
{
    internal ConcreteClassB() {}
}

必要なものはこの防止のためのデフォルトのコンストラクタを作成します。●内部で置き換えられるべきである公共の場合は、授業のない同一ます。

public abstract class AbstractClass{

 public static AbstractClass MakeAbstractClass(string args)
 {
    if (args == "a")
        return ConcreteClassA().GetConcreteClassA();
    if (args == "b")
        return ConcreteClassB().GetConcreteClassB();
 }
}

public class ConcreteClassA : AbstractClass
{
  private ConcreteClassA(){}

  internal static ConcreteClassA GetConcreteClassA(){
       return ConcreteClassA();
  }
}

public class ConcreteClassB : AbstractClass
{
  private ConcreteClassB(){}
  internal static ConcreteClassB Get ConcreteClassB(){
       return ConcreteClassB();
  }

}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top