c# - C# 中的多重继承 - 再次

标签 c# asp.net

我知道 C# 不提供多重继承。我知道有像 this one 这样的解决方法例如。

但是我今天遇到了一个问题,想不出任何 ELEGANT 解决方法。我将添加一些抽象的代码示例,以便您更快地理解...

(让它成为现实生活中的 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;

最佳答案

编写出功能?这对于单一职责更好。您必须仔细考虑您的构造函数。

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();
  }
}

如果你真的想要多重继承,看看Scala的traits

编辑:将构造函数值传递给组合类。还使这些类成为内部类(无法在程序集外部访问或构造),因为它们仅由 AdminJQueryPage 类构造,这是“面向公众的”类。

关于c# - C# 中的多重继承 - 再次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1846099/

相关文章:

c# - Apps 脚本 API 响应没有 "result" key

asp.net - 用户在我的网站上点击确认后如何确认 Paypal express 付款?

c# - 检查当前登录的用户是否有持久的 authcookie

asp.net - 为什么我在 IIS7 下运行的 ASP.Net 站点在一段时间不活动后需要很长时间才能加载?

c# - ASP.NET 标识角色

c# - 如何将我的 asp.net 项目发布到本地 iis?

c# - 无法在 2 个不同的类库项目中实例化类

c# - 我如何判断是否至少选择了一个 dataGridView 行 c#

c# - 将当前查看的 Outlook 电子邮件正文存储到字符串中

带有 zzz 的 C# DateTime.ToString 在 dotnet 框架中中断,但不在 dotnet 核心中