C#中的多重继承 - 再次

Ale*_*lex 4 c# asp.net

我知道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)

Joe*_*Joe 9

撰写功能?这对单一责任更好.你必须仔细考虑你的构造函数.

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类构成,这是"面向公众"的类.