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