我怎样才能有一个对象可以是任何具有相同方法的类?

时间:2016-05-12 13:29:50

标签: c# .net duck-typing

我有一个基本的c#app来处理一些sql文件。我为每种类型的对象都有一个类,如proc,function,view等。

我想要做的主要是确定我处理什么样的脚本文件,然后创建该类的实例。

然后使用该对象,将其命名为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

4 个答案:

答案 0 :(得分:4)

  1. 创建界面
  2. 创建实现该接口的类
  3. 将您的对象声明为该接口
  4. 将您的对象实例化为实现接口的类之一
  5. 像这样:

     git svn clone --stdlayout full/svn/repo/url/projectA
     git svn clone --stdlayout full/svn/repo/url/projectB
    

答案 1 :(得分:0)

使用dynamic

dynamic objSqlType;

// rest of code

string header = objSqlType.getHeader();

此外,您似乎在这里使用了未初始化的变量,因为如果您处于default情况,那么objSqlType未初始化且您无法使用未初始化的本地变量。

答案 2 :(得分:0)

创建一个接口并使每个对象都实现它。或者,创建一个抽象类,并使每个对象都从它继承。

答案 3 :(得分: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()
     {}
}

现在创建

的包装器或工厂类
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;
     }
}

现在在main方法中你可以有类似下面的内容

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

}