簡體   English   中英

更新:從用戶控件上的自定義控件覆蓋方法

[英]Update: Override method from custom control on user control

早上好。

這是我想要實現的目標。

對於CustomControlA ,我有

public void OverrideableMethod()
{
// some codes here
}

我有UserControlB 我想從“越權”的方法CustomControlAUserControlB 這可能嗎? 如果是,該怎么辦?

我能想到的最好的辦法是在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()

如果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
        }   
    }
}

您應該為控件添加代碼以使其清楚。

在以下情況下是可能的,並且順便說一句,您不會從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中的NEW代碼,則可以執行以下操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM