如何在没有多重继承/代码重复的情况下在Pages和Masterpages之间共享代码?

时间:2010-09-13 11:06:57

标签: c# asp.net master-pages multiple-inheritance code-duplication

我已经阅读questions/answers解释 C#中没有多重继承,我们甚至不需要它,并且它会导致太多问题。

现在,我正在开展一个项目,我不知道如何在没有多重继承的情况下做事情,而不会重复代码。

这是情况。有一个主页和其他页面继承自主页(主页不继承)的网站。页面和母版页都在执行一些操作:自定义登录,统计,加载用户设置以进行自定义等。目前,解决方案很糟糕,因为这些任务的源代码只是被复制了两次

主页类继承自Page。另一方面,母版页继承自Masterpage。从逻辑上讲,从公共类继承也很棒,但它是多重继承,所以这是不可能的。

那么该做什么呢?

我想过几种方法,但不喜欢它们:

  • 创建一个独立类,将从页面/母版页类调用。因此,例如,我写bool isDisplayingTips = this.CurrentUser.IsDisplayingTips而不是写bool isDisplayingTips = this.SharedObjects.CurrentUser.IsDisplayingTips。我不喜欢它,因为它写的时间更长。

  • 创建“真实”,空白,公共母版页,并从中继承主页和母版页。它不仅需要编写更多代码来访问母版页参数,而且还会减慢速度,每次请求都需要额外的母版页。

有什么想法吗?

4 个答案:

答案 0 :(得分:8)

MasterPage是一个公正的控件(嵌入到实际页面中),因此您无法使用后面的方法。但是,创建另一个辅助类的第一种方法是非常可行的。

我们通常使用的另一种方法是

  1. 公共基页类 - 所有页面都将从公共基页继承。
  2. 将基本功能放在基页类
  3. 从母版页,可以通过强制转换引用基页 - 例如myBasePage = (BasePage)this.Page;。这样主页面可以从基页类访问常用功能。

答案 1 :(得分:1)

我找不到你不喜欢的第二个选项。

我认为你的意思是创建一个基类,例如MasterPageBase,源自System.Web.UI.MasterPage,并为您的主页创建一个空的MasterPage,将继承此MasterPageBase

如果做得好,它不应该让事情变慢......

答案 2 :(得分:1)

我建议您使用第一个选项。如果你(可以理解) 对于增加间接级别感到不舒服,您可以在独立的classe上创建新方法,例如:

public bool IsDisplayingTips(){
    return CurrentUser.IsDisplayingTips;
}

并从您的网页中调用

bool isDisplayingTips = this.SharedObjects.IsDisplayingTips()

答案 3 :(得分:1)

使用:

  

将被调用的独立类   来自页面/母版页

但不是停在那里,而是添加基页和基本母版页。两者都使用共享类,并保持间接的特定页面/母版页代码。