2009-10-14 55 views
1

我有2类的是否有可能拥有2个基类已经从继承或知道第三个普通类继承?

类1.

public class BaseContentPage : System.Web.UI.Page 
{ 

} 

类2

public class BaseUserControl : System.Web.UI.UserControl 
{ 


} 

,现在我希望他们知道这个类的。

public class BaseCommon 
{ 
    public string Variable1 { get; set; } 
    public string Variable2 { get; set; } 
    public string Variable3 { get; set; } 
} 

如何我目前做的是通过使BaseCommon类的静态变量,像这样

public static string Variable1 { get; set; } 
public static string Variable2 { get; set; } 
public static string Variable3 { get; set; } 

我还能怎么办呢?

回答

5

使用组合物。

为BaseContentPage和BaseUserControl提供一个BaseCommon类型的私有字段(如果需要,它可以作为属性公开)(不要使其成为静态的)。

他们可以创建BaseCommon或通过构造函数(依赖注入)传入一个实例。

+0

嘿,我打算说;-) – 2009-10-14 01:33:47

0

如果它们是静态的,这是否意味着这个第三类是全球资源?您可以查看Singleton或IoC容器,或者在构建时将实例传递给其他类。

您需要给出更多具体的例子,说明您将要添加到对象继承树的两个不同部分的常见“基础”数据是什么。可以想象,假设每个实例真的只有类似的数据(我想到的一个例子是国际化,也就是说,用于根据上下文中特定的短语ID等自定义页面和用户控件) ,那么你可以做的是有一个实现II18nSettings的I18nSettings类。然后在每个类中封装一个I18nSettings实例并实现II18nSettings并将它们传递给它们。或者,您可以公开内部I18nSettings实例。我甚至只是定义了一个接口,并让每个类都实现它 - 根本不值得有一个单独的类。

还有其他的选择可以做这种事情 - 这取决于你所继承的具体类是否实现了比你添加的东西更有用的东西。从具体类继承并实现其他接口可能更有意义,以便该类可以在其他地方使用。

+0

我不希望全球资源这就是为什么我不想使用静态。 – BlackTea 2009-10-14 01:34:18

+0

扩大了我关于非全球目标备选方案的笔记。 – 2009-10-14 01:48:36

1

首先,我不认为你希望BaseCommon属性是静态的。这些属性在整个应用程序中是全局的,所以从一个实例改变它们会改变它们的所有实例。

你说的是多重继承,它不被c#支持。将BaseCommon改为一个接口并让BaseContentPage和BaseUserControl实现该接口会更好。