2014-01-16 3 views
0

доброе утро.Обновление: метод переопределения из пользовательского элемента управления при управлении пользователем

Это то, чего я хотел бы достичь.

для 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

Почему вы так делаете? –

+0

и вы не можете переопределить CustomControlA таким образом, однако вы можете добавить событие в CustomControlA, а затем зарегистрироваться в нем из USerControlB –

+0

@TMcKeown Я надеялся, что UserControlB наследует другой базовый класс. – AceMark

ответ

3

Для переопределения методов в дочернем классе вам необходимо использовать виртуальные и переопределяющие ключевые слова, если пользователь UserControlB является дочерним классом CustomControlA. Если нет, то это не метод переопределения.

public class CustomControlA 
{ 
    public virtual void OverrideableMethod() 
    { 
     // some codes here 
     } 
} 

public class UserControlB: CustomControlA 
{ 
    public override void OverrideableMethod() 
    { 
     // some codes here 
    } 

} 

UPDATE (на основе обновленной части вашего вопроса): Нет его не представляется возможным сделать подмену (на самом деле вы даже не пытаетесь сделать подмену), но вы можете сделать что-то, как показано ниже.Вы всегда должны звонить 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

убедитесь, что CustomControlA является общедоступным, иначе он не может быть унаследован. –

+0

Да обновил ответ. Благодарю. –

+0

спасибо. ваш ответ был одним из путей, которые я думаю о принятии. Я обновил вопрос. можете ли вы взглянуть на него? – AceMark

2

Вы должны опубликовать свой код для элементов управления, чтобы это стало ясно.

Возможно при следующих условиях, и, кстати, вы не будете вызывать CustomControlA.OverrideableMethod() из UserControlB. Если 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».

+0

спасибо. ваш ответ был одним из путей, которые я думаю о принятии. Я обновил вопрос. можете ли вы взглянуть на него? – AceMark

Смежные вопросы