1

我有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; }

我还能怎么做?

4

3 回答 3

5

使用组合。

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

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

于 2009-10-14T01:31:40.700 回答
1

首先,我认为您不希望 BaseCommon 属性是静态的。然后属性在整个应用程序中是全局的,因此从一个实例更改它们将更改所有实例的它们。

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

于 2009-10-14T01:30:58.907 回答
0

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

您需要提供更具体的示例,说明您添加到对象继承树的两个不同部分的常见“基础”数据是什么。

可以想象,假设每个实例实际上只有相似的数据(我正在考虑的一个示例是国际化,例如,它用于根据上下文中特定的短语 ID 等自定义页面和用户控件),那么你可以做的是有一个实现 II18nSettings 的类 I18nSettings。然后在每个类中,封装一个I18nSettings实例,实现II18nSettings并传递。或者,您可以公开内部 I18nSettings 实例。我什至刚刚定义了一个接口并让每个类都实现它——根本不值得拥有一个单独的类。

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

于 2009-10-14T01:29:19.893 回答