2017-05-31 1 views
1

これが意味を成しているかどうかはわからないので、広く尋ねます。 クラスのセットは、常にという名前の関数を実装するように強制できますか?です。各クラスのメソッドは異なるシグネチャを持つことができますが、同じ名前を持つ必要があります。以下のようないくつか:C#すべてのクラスに特定の名前のメソッドがあるようにする方法

public class ClassOne { 
    public int GetSomething (int a, int b, out int c) { } 
} 

public class ClassTwo { 
    public int GetSomething (int a, out string b) {} 
} 

私はGetSomethingメソッドを実装するには、このライブラリの一部としてClassThreeまたはClassFourを書き込み、誰もが欲しいです。これを強制するためのC#の構造はありますか?

これについてのデザインレビューを検討していません。コードレビューを手動で強制することなく、その可能性があるかどうかを知りたいだけです。

+2

インターフェイスを使用してください。 – Wheels73

+0

なぜこれほど多くのインターフェースを実装していないのですか?これはインターフェース分離の原理です –

+2

これはなぜ必要なのですか?なぜ何か*やおそらく*何かを返すメソッドの共通名が必要なのですか?すべてのクラスに特定のメンバがあるように強制する場合は、そのメンバをベースクラスに抽象化します。しかし、これはシグネチャとAPIが常に同じ場合にのみ意味を持ちます。 – HimBromBeere

答えて

6

すぐに使用できるC#ではこれを行うことはできません。 C#には抽象クラスとインタフェースがありますが、名前だけではなくメソッドに固有のシグネチャが必要です。

code analyzers in Roslynを作成してコードを確認し、必要な方法があればこのコードを確認してください。

しかし、私はあなたがこのすべてをすべきだとは思わない。私は、あなたがここで特定の名前のメソッドを必要とすることで、その引数を強制することなく、設計上の欠陥を作っていると思います。

すべてのC#アプリケーションにあるMainメソッドに似たメソッドをいつでも実装できます。多くの変数を入れることができるパラメータとしてstring[]を使用します。私の場合はobject[]を選択します。しかし、このデザインには明らかに欠点があります。

0
  1. 必要な方法でインターフェイスを追加します。
  2. セットクラスこのinterace

    インタフェースISampleInterface {ボイドSampleMethod()から継承します。 }

    class ImplementationClass1 : ISampleInterface 
    { 
        // Explicit interface member implementation: 
        void ISampleInterface.SampleMethod() 
        { 
         // Method implementation. 
        } 
    

    }未知の引数のメソッドを持つクラスの目的は何

0

。 OOPの点ではちょうど非論理的です。どのようにこのメソッドを呼び出すつもりですか?いくつかのケースでは

public interface IBaseInterface 
{ 
    public int GetSomething(Dictionary<string, object> args); // keys matter 
} 

または

public interface IBaseInterface 
{ 
    public int GetSomething(params object[] args); // order matters 
} 

Func<>/ Action<>高次機能が有用である可能性がある:引数が均一であるならば、あなただけのような何かを行うことができます。
ユースケースを提供した場合、より正確な回答をすることができます。 あなたはそのようなメソッドをどのように呼び出すのかを示し、私はそれをより良くする方法を示すようにしようとします。唯一 技術側からあなたの質問に答える

、あなたが次のことを行うことができます:

public abstract class BaseClass 
{ 
    protected BaseClass() 
    { 
     if (this.GetType().GetMethod("GetSomething") == null) 
      throw new InvalidOperationException("BaseClass subclasses should implement 'GetSomething' method"); 
    } 
} 

public class ClassOne : BaseClass { 
    public int GetSomething (int a, int b, out int c) { } 
} 

public class ClassTwo : BaseClass { 
    public int GetSomething (int a, out string b) {} 
} 

それは、デザイン時に保証この動作をしませんが、このような方法は実行時に存在することを保証します - 時間

0

"Criteria"オブジェクトにパラメータをカプセル化する方法はありますか?

public interface IGettable 
{ 
    int GetSomething (Criteria crit); 
} 

public class Criteria 
{ 
    public CriteriaType type {get; set;}; 
    public int a {get; set;}; 
    public int b {get; set;}; 
    ... 

    public static Criteria ClassOneCriteria(int a, int b) 
    { 
     return new Criteria 
     { 
      type = CriteriaType.ClassOneCriteria, 
      a = a, 
      b = b 
     } 
    } 
    ... 
} 

public enum CriteriaType 
{ 
    ClassOneCriteria, 
    ClassTwoCriteria 
} 

public class ClassOne : IGettable 
{ 
    public int GetSomething (Criteria crit) 
    { 
     if (crit.type != CriteriaType.ClassOneCriteria) 
      throw new Exception("Invalid criteria type for Class One"); 
     ... 
    } 
} 
関連する問題