如何使用相同的方法让一个对象可以是任何 class?
How can I have one object that can be any class with the same methods?
我有一个基本的 c# 应用程序来处理一些 sql 文件。我对每种类型的对象都有一个 class,例如 proc、函数、视图等
我主要想做的是确定我正在处理哪种脚本文件,然后他们创建该文件的实例 class。
然后使用该对象,将其称为 objSqlType,我想在底层 class 中调用一个方法。每个 class 将具有相同的方法名称,如 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
使用dynamic
dynamic objSqlType;
// rest of code
string header = objSqlType.getHeader();
此外,您似乎在这里使用了未初始化的变量,因为如果您属于 default
情况,则 objSqlType
未初始化,您不能使用未初始化的局部变量。
创建一个接口并让每个对象实现它。或者,创建一个抽象 class 并使每个对象都继承它。
- 创建界面
- 创建实现该接口的类
- 将您的对象声明为该接口
- 将您的对象实例化为实现接口
的类之一
像这样:
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();
下面的代码可能对您有所帮助。我不确定你是否要从客户端删除创建新对象并使其集中化。
你可以考虑用解耦的方式提出你的需求
喜欢..
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,这将是
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");
}
我有一个基本的 c# 应用程序来处理一些 sql 文件。我对每种类型的对象都有一个 class,例如 proc、函数、视图等
我主要想做的是确定我正在处理哪种脚本文件,然后他们创建该文件的实例 class。
然后使用该对象,将其称为 objSqlType,我想在底层 class 中调用一个方法。每个 class 将具有相同的方法名称,如 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
使用dynamic
dynamic objSqlType;
// rest of code
string header = objSqlType.getHeader();
此外,您似乎在这里使用了未初始化的变量,因为如果您属于 default
情况,则 objSqlType
未初始化,您不能使用未初始化的局部变量。
创建一个接口并让每个对象实现它。或者,创建一个抽象 class 并使每个对象都继承它。
- 创建界面
- 创建实现该接口的类
- 将您的对象声明为该接口
- 将您的对象实例化为实现接口 的类之一
像这样:
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();
下面的代码可能对您有所帮助。我不确定你是否要从客户端删除创建新对象并使其集中化。
你可以考虑用解耦的方式提出你的需求 喜欢..
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,这将是
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");
}