3

呼び出されたコンストラクターに基づいて、どのメソッドがオブジェクトに公開されるかを (デコレーターを使用して) 選択的に選択することは可能ですか?

たとえば、私のクラスには 2 つのコンストラクターがあります。空のコンストラクターと、ファイル パス文字列を渡すコンストラクターです。

public class MyClass
{
    private readonly string _filePath;
    public MyClass()
    {

    }

    public MyClass(string filePath)
    {
         _filePath = filePath
    }

    public Export()
    {
        var fi = new FileInfo(_filePath);
    }
}

新しい MyClass オブジェクトを作成するときに、パラメーターを指定してコンストラクターを使用して Export メソッドを公開する場合にのみ可能ですか?

var myClass = new MyClass();
//myClass.Export() not available

var myClass = new MyClass(@"C:\");
//myClass.Export() is available
4

5 に答える 5

1

これは、2 つの異なるタイプが必要であることを示しています。おそらく、それらは両方とも親タイプ (おそらく抽象型) のサブタイプである必要があるか、または一方が他方を単純に拡張する必要があります。

次に、文字列があるかどうかに基づいて、適切な型のインスタンスを構築できます。文字列を持つ型には、追加のメソッドを含めることができます。

public class MyClass
{
    public MyClass()
    {

    }

    public void Foo()
    {
        //todo do stuff
    }
}

public class BetterMyClass : MyClass
{
    private readonly string _filePath;

    public BetterMyClass(string filePath)
    {
        _filePath = filePath;
    }

    public void Export()
    {
        var fi = new FileInfo(_filePath);
    }
}

そして、あなたの使い方はうまくいきます:

var myClass = new MyClass();
//myClass.Export(); //syntax error

var myClass2 = new BetterMyClass(@"C:\");
myClass.Export(); //works
于 2013-10-24T19:20:47.213 に答える
1

直接ではありません。あなたは出来る:

  1. 型のオブジェクトを返すファクトリ メソッドを作成し、IMyInterface公開するメソッドを含む型にキャストしようとします。オブジェクトがメソッドを公開している型でない場合、キャストは失敗します。または..

  2. dynamicオブジェクトの使用。メソッドが存在しない場合、メソッド呼び出しは実行時に失敗します。

于 2013-10-24T19:24:56.533 に答える
0

私の知る限り、いいえ、これはあなたが言っているようにはできません。可能であれば、コンパイラは通常、問題のメソッドが問題のオブジェクトに対して有効かどうかを知る方法がありません。その後、実行時にチェックする必要があります。使用できないときにメソッドを呼び出すと、実行時例外が発生します。コンストラクターで設定されたフラグに基づいて、自分で例外をスローできます。

ただし、最終的には、追加のオプションを持つサブクラスが本当に必要になる可能性があります。これは、このタイプの機能を有効にするより安全な方法です。

于 2013-10-24T19:22:23.497 に答える
0

これは可能ですが、ここで示している方法ではありません。Exportデフォルトのコンストラクターのみを持ち、メソッドを持たない新しいクラスを作成したいと思うでしょう。次に、最初のクラスから継承する 2 番目のクラスを作成し、 を必要とし、メソッドstringを公開するコンストラクターを持ちます。Export

public class MyClass
{
    public MyClass()
    { }
}

public class MyOtherClass : MyClass
{
    private readonly string value;

    public MyOtherClass(string value)
    {
        this.value = value;
    }

    public string Export() { return this.value; }
}

私の意見ではばかげた設計上の決定である選択性が絶対に必要な場合は、メソッドを実装するか実装しないかのいずれかのコード生成を使用して実行時に構築される型を使用することをお勧めします。

于 2013-10-24T19:20:40.463 に答える