更新:从用户控件的自定义控件覆盖方法

时间:2014-01-16 01:02:49

标签: c# asp.net

早上好。

这是我想要达到的目标。

对于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()

2 个答案:

答案 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”方法之前和/或之后添加代码。