2014-01-16 28 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,但是你可以添加一个Event到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

您应该发布控件的代码以使其清晰。

它可能在下列条件下,顺便说一句,你不会从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”方法的任何直接调用,并强制调用public/well定义的方法。它使您能够在“OnXXX”方法之前和/或之后添加代码。

+0

谢谢。你的回答是我正在考虑的途径之一。我已经更新了这个问题。你可以看看吗? – AceMark