El *_*oco 0 c# inheritance overriding class-design
我想做的事情非常简单.我有一个类来处理我的数据库执行调用clsSQLInterface.此类包含一个静态函数bool isSQLSafe,false如果发送执行的SQL被认为是危险的,它将返回.这是我有一点我可以过滤掉任何恶意事件.
现在,我的程序的其他部分实际需要的能够做这样的事情UPDATE,DELETE等等.所以我想我会继承clsSQLInterface类并重写isSQLSafe的东西,总是返回功能true.
这不是关于数据库安全性的问题btw!
好的,所以我这样做了......
public class clsSQLInterface //Code not shown, just definitions
{
private static string connectionString(string sKey){...}
public static bool isSQLSafe(string sSQL){...}
public static DataTable executeSQLText(string sSQL, string sConnectionKey){...}
public static DataTable executeGenericQuery(clsGenericSQL query,string sDBKey){...}
}
Run Code Online (Sandbox Code Playgroud)
而最重要的课程..
public class clsSQLInterface_unsafe : clsSQLInterface
{
public clsSQLInterface_unsafe()
{
}
public new static bool isSQLSafe(string sSQL) //overriding the base method
{ return true; }
}
Run Code Online (Sandbox Code Playgroud)
好.这种方法的问题是,isSQLSafe从方法中调用executeSQLText和executeGenericQuery.我想要这些方法做的是调用重写isSQLSafe,它总是返回true.但是,他们没有.他们称之为基础实现.
我是否还必须覆盖每个调用的方法isSQLSafe?这似乎浪费了代码.
当我继承这个类时,我实际上是在"复制"所有基本方法,它们应该表现得像现在一样clsSQLInterface_unsafe?
您无法覆盖静态方法.它们不是继承的,它们是类的方法,而不是类的实例.基类中的静态方法总是在同一个类中调用静态方法.
只是使方法不是静态和虚拟的,然后在派生类中覆盖它们应该可以解决您的问题.
编辑:new static修饰符只是告诉编译器你打算隐藏基类的方法(尝试删除它并看到你得到的警告),但它不会覆盖任何东西.
覆盖意味着函数的派生类版本取代了虚拟表中的基类版本.
虚拟表是与实例关联的方法的索引.没有实例,没有虚拟表,因此您无法覆盖静态方法.
PS:看看这里虚拟表的更好解释:http://en.wikipedia.org/wiki/Virtual_method_table
| 归档时间: |
|
| 查看次数: |
1361 次 |
| 最近记录: |