我知道C#不提供多重继承.我知道有一些像这样的解决方法.
但这是我今天面临的一个问题,无法找出任何优雅的解决方法.我将添加一些抽象的代码示例,以便您更快地获得它...
(让它成为现实生活中的ASP.NET代码 - 导致那些"A类,B类"代码样本真的令人困惑):
public class AdminPage : System.Web.UI.Page
{
protected override void OnInit(EventArgs e)
{
//if not an admin - get out
if(!CurrentUserIsAdmin()) Response.End();
base.OnInit (e);
}
}
public class JQueryPage : System.Web.UI.Page
{
protected override void OnInit(EventArgs e)
{
RegisterJQueryScript();
base.OnLoad (e);
}
}
//now here's what I REALLY miss in C#
public class AdminJQueryPage : AdminPage, JQueryPage;
Run Code Online (Sandbox Code Playgroud)
撰写功能?这对单一责任更好.你必须仔细考虑你的构造函数.
interface IAdminPage {
public string AdminPageMethod();
}
interface IJQueryPage {
public string JQueryPageMethod();
}
internal class AdminPage : IAdminpage {
private string someString;
internal AdminPage(string value) {
this.someString = value;
}
public string AdminPageMethod() {
return "AdminPage result with some string: " + this.someString;
}
}
internal JQueryPage : IJQueryPage {
private int someNumber;
internal JQueryPage(int value) {
this.someNumber = value;
}
public string JQueryPageMethod() {
return "JQueryPage result with number: " + this.someNumber;
}
}
class AdminJQueryPage : IQueryPage, IAdminpage {
private readonly IAdminPage adminPage;
private readonly IJQueryPage jqueryPage;
public AdminJQueryPage(string someString, int someNumber) {
this.adminPage = new AdminPage(someString);
this.jqueryPage = new JQueryPage(someNumber);
}
public string AdminPageMethod() {
return this.adminPage.AdminPageMethod();
}
public string JQueryPageMethod() {
return this.adminPage.JQueryPageMethod();
}
}
Run Code Online (Sandbox Code Playgroud)
如果您真的想要多重继承,请查看Scala的特征
编辑:将构造函数值的传递添加到组合的类中.还使类内部(不能在程序集外部访问或构造),因为它们只是由AdminJQueryPage类构成,这是"面向公众"的类.
| 归档时间: |
|
| 查看次数: |
2183 次 |
| 最近记录: |