2016-05-12 8 views
0

私はいくつかのSQLファイルを処理するための基本的なC#アプリを持っています。私は、proc、関数、ビューなどのオブジェクトの種類ごとにクラスを持っています。同じメソッドを持つ任意のクラスにできるオブジェクトを1つ作成するにはどうすればよいですか?

私が主にしたいのは、どのような種類のスクリプトファイルが処理され、それらのクラスのインスタンスを作成するかを決定することです。

次に、そのオブジェクトを使用して、objSqlTypeと呼んで、基本クラスのメソッドを呼び出したいとします。各クラスはgetHeader()、getPermissions()などのように実装された同じメソッド名を持ちます

これは可能です。私は、例えば

、メソッドを作成するために私を強制しますが、単一のオブジェクトを使用するように見えることはできませんどのインターフェイスを見て:

object objSqlType; 

switch (type) 
{ 
    case ObjectType.PROC: 
     objSqlType = new SqlProc(); 
     break; 
    case ObjectType.FUNCTION: 
     objSqlType = new SqlFunction(); 
     break; 
    case ObjectType.VIEW: 
     objSqlType = new SqlView(); 
     break; 
    default: 
     break; 
} 

string header = objSqlType.getHeader(); // call getHeader for whichever object I created 
+1

[反射を使用してmethを呼び出す方法od by name](http://stackoverflow.com/questions/3110280/how-to-use-reflection-to-call-method-by-name)、それはあなたがメソッド名を知っていればそれを行うべきであり、すべての型はそれを持っています(メソッドが他に存在するかどうかを確認できます)。デザインの観点からは、ただし、インターフェイスを使用する必要があります(オブジェクトが似ている場合は基本クラス)。 – Sinatr

+3

の代わりに 'object objSqlType;' yourInterface objSqlType;を使用してください。おそらく、インターフェイスの代わりに基本クラスを使用することを検討してください。 – Ondra

+0

汎用オブジェクトMainObject を作成します。ここで、Tはfunc、proc、viewのいずれかのクラスになります。これらのクラスはすべて同じインタフェースIMyInterfaceを実装します。'class MainObject ここで、T:IMyInterface {public T myObject {get; set;} ...}'。 – CFreitas

答えて

4
  1. は、そのインターフェイスを実装するクラスを作成します。インターフェイスを作成
  2. は、このようなインターフェース

を実装するクラスの一つとして、あなたのオブジェクトをインスタンス化し、そのインタフェースとして、あなたのオブジェクトを宣言します:

public interface ISqlType 
{ 
    string getHeader(); 
} 

public class SqlProc : ISqlType 
{ 
    public string getHeader() 
    { 
     return "I'm a SqlProc!" 
    } 
} 

public class SqlFunction : ISqlType 
{ 
    public string getHeader() 
    { 
     return "I'm a SqlFunction!" 
    } 
} 

public class SqlView : ISqlType 
{ 
    public string getHeader() 
    { 
     return "I'm a SqlView!" 
    } 
} 

ISqlType objSqlType; 

switch (type) 
{ 
    case ObjectType.PROC: 
     objSqlType = new SqlProc(); 
     break; 
    case ObjectType.FUNCTION: 
     objSqlType = new SqlFunction(); 
     break; 
    case ObjectType.VIEW: 
     objSqlType = new SqlView(); 
     break; 
    default: 
     break; 
} 

string header = objSqlType.getHeader(); 
+0

ありがとう!これはまさに私が後にしたものです。私はインターフェイスとしてジェネリックタイプを定義していませんでした!ありがとう。 – user3781891

0

使用dynamic

dynamic objSqlType; 

// rest of code 

string header = objSqlType.getHeader(); 

また、あなたがしているようですここで初期化されていない変数を使用すると、defaultの場合はobjSqlTypeになり、初期化されていないローカル変数は使用できません。

+0

私は引用しています:_したがって、コンパイラエラーは報告されていません。ただし、エラーは無期限に通知をエスケープしません。実行時にキャッチされ、実行時例外が発生します._ https://msdn.microsoft.com/en-us/library/dd264736.aspxなぜあなたはあなたのコードでそれを望みますか? –

0

インターフェイスを作成し、すべてのオブジェクトにインターフェイスを実装させます。または、抽象クラスを作成し、すべてのオブジェクトに継承させることもできます。

0

以下のコードが役に立つかもしれません。私はあなたがクライアントから新しいオブジェクトを作成してそれを集中化させるかどうか分からない。

あなたは

interface IDBObject 
{ 
    string GetDBType() 
} 

then have your required classes and implement respect interface 

public class SQLStoreProc:IDBObject 
{ 
    public string GetDBType() 
    {} 
} 

public class SQLFunction:IDBObject 
{ 
public string GetDBType() 
    {} 
} 

public class SQLMisc:IDBObject 
{ 
public string GetDBType() 
    {} 
} 

今すぐmainメソッドで今

class clsFactory 
{ 
    public static IDBObject CreateObject(string type) 
    { 
     IDBObject ObjSelector = null; 

     switch (type) 
     { 
      case "SP": 
       ObjSelector = new SQLStoreProc(); 
       break; 
      case "FUNC": 
       ObjSelector = new SQLFucntion(); 
       break; 
      default: 
       ObjSelector = new SQLMisc(); 
       break; 
     } 
     return ObjSelector; 
    } 
} 

になりますあなたのラッパーやファクトリクラスを作成 よう..あなたが何かを持つことができる切り離された方法であなたの条件を作ると考えることができます以下のように

public static void main (args a) 
{ 
    IDBObject ObjIntrface = null; 
    ObjIntrface = clsFactory.CreateObject(your object type); 
    string res = ObjIntrface.GetDBType("First", "Second"); 

} 
関連する問題