这是我想要达到的目标。
对于CustomControlA
,我有
public void OverrideableMethod()
{
// some codes here
}
我有UserControlB
。
我想从CustomControlA
UserControlB
“覆盖”该方法。 这可能吗?如果是,如何?
我能提出的最好的事情是在UserControlB
上创建一个同名的方法,然后从那里调用CustomControlA.OverrideableMethod()
。
<小时/> 的更新 感谢您的回答,我感谢他们。
代码是这样的:
public class CustomControlA : CustomControl
{
public virtual void OverrideableMethod()
{
// do something
}
}
public class UserContorlB : System.Web.UI.UserControl
{
protected CustomControlA someVariableForCustomControlA;
// here lies the problem, on how to override CustomControlA.OverrideableMethod() here
// without inheriting CustomControlA itself
}
这就是问题所在。尽可能地,我想远离继承CustomControlA,原因是允许UserControlB
继承一个更多的基类。
考虑到上述情况,是否可以覆盖CustomControlA.OverrideableMethod()
?
答案 0 :(得分:3)
如果所有UserControlB都是CustomControlA的子类,则需要使用virtual和override关键字来覆盖子类中的方法。如果没有那么它不是方法覆盖。
public class CustomControlA
{
public virtual void OverrideableMethod()
{
// some codes here
}
}
public class UserControlB: CustomControlA
{
public override void OverrideableMethod()
{
// some codes here
}
}
更新(根据您问题的更新部分):
没有它不可能做覆盖(实际上你甚至没有尝试覆盖),但你可以做类似下面的事情。你应该总是打电话给UserContorlB.OverrideableMethod()
,但要确保你有一些条件,根据这些条件调用正确的方法。
public class CustomControlA
{
public void OverrideableMethod()
{
// do something
}
}
public class UserContorlB : System.Web.UI.UserControl
{
protected CustomControlA someVariableForCustomControlA;
public void OverrideableMethod()
{
if(some condition is true)
{
someVariableForCustomControlA.OverrideableMethod();
}
else
{
// do some logic here
}
}
}
答案 1 :(得分:2)
您应该发布控件的代码,以便明确这一点。
可以在以下条件下,顺便提一下,你不会从UserControlB调用CustomControlA.OverrideableMethod()。如果UserControlB继承了CustomControlA,则该方法存在于UserControlB中:
public class CustomControlA : UserControl
{
public virtual void OverrideableMethod() { /* code the default implementation */ }
}
您的UserControlB将扩展/继承CustomControlA
public class UserControlB : CustomControlA
{
public override void OverrideableMethod() { /* implement whatever you want */ }
}
如果CustomControlA的方法有你想要执行的代码以及UserControlB中的新代码,你可以这样做:
public class UserControlB : CustomControlA
{
public override void OverrideableMethod()
{
base.OverrideableMethod();
/*
additional code here
*/
}
}
构建将触发后代代码的基类时,继承方法的最佳实践如下:
public class CustomControlA : UserControl
{
public void OverrideableMethod()
{
//You can code here for things before the overrideable method
OnOverrideableMethod();
//You can code here for things after the overrideable method
}
protected virtual void OnOverrideableMethod() { }
}
public class UserControlB : CustomControlA
{
protected override void OnOverrideableMethod()
{
/* implement here */
}
}
这可以防止对“OnXXXX”方法的任何直接调用,并强制调用公共/定义良好的方法。它使您能够在“OnXXX”方法之前和/或之后添加代码。