从二次派生函数访问基础 class 函数
Accessing base class function from secondarily derived functions
I seriously hope my title is clear enough. If it's not I'm happy to have better suggestions.
The situation is thus (variable types are just examples):
public abstract class A
{
public virtual string X(string arg)
{
return "blarg";
}
}
public class CommonProperties : A
{
public string foof { get; set;} = "widget";
public string yay { get; set; }
public override string X(string arg)
{
return base.X(arg);
}
}
public class B : CommonProperties
{
public string UniqueProperty1 { get; set; }
public override string X(string arg)
{
return base.X(arg);
}
}
public class C : CommonProperties
{
public string UniqueProperty2 { get; set; }
public override string X(string arg)
{
return base.X(arg);
}
}
class D : A
{
public override string X(string arg)
{
return base.X(arg);
}
}
}
我正在概括我的问题。这不是我的实际代码。
问题是 C# 不允许抽象 classes 的多重继承,接口不允许默认代码(目前)也不允许默认初始化器。
我希望 CommonProperties 从抽象 class 派生,classes 从 it 派生(classes B和 C) 能够直接访问 X 函数的原始抽象 class 实现,而不是覆盖它的 CommonProperties 实现。我试过 base.base.X(arg) 但没有用。下一个最好的方法是让 classes B 和 C 从 class A and class CommonProperties 派生,但 C# 不允许这样做.使 class A 成为一个接口是行不通的,因为我有大量的 class 是从它派生出来的,这意味着我必须将需要的代码复制到每个接口中。单身的。一。由于对默认值的限制,我无法将 CommonProperties 设为接口。我可以将公共属性移动到它们派生的 classes 中,但这会破坏代码重用(我可能需要随着时间的推移添加额外的属性,这意味着更新会更慢并且更容易出错,等等)
我等不及 C# 8.0(理论上)具有函数的默认实现。如果我能让 B 和 C 直接访问被 CommonProperties.X() 函数隐藏的隐藏 A.X() 函数,那将是一个很好的解决方法。我怀疑后一种解决方案可以通过反射实现(实际上在我的项目中 A class 就是这样做的,所以这个话题对我来说并不难),但我想知道是否有更直接的方法。
编辑:再添加一个 class 以更好地阐明问题。我忘记了 CommonProperties 应该继承自 A 并且还显示 other classes 直接继承自 A.
您需要向 class A
添加一个调用 A.X
实现的非虚方法。方法名包含class名,我用双下划线分隔方法名和class名。
public abstract class A
{
public virtual string X(string arg)
{
return "blarg";
}
public string X__A(string arg)
{
return X(arg);
}
}
public class CommonProperties : A
{
public string foof { get; set;} = "widget";
public string yay { get; set; }
public override string X(string arg)
{
return "comarg";
}
}
public class B : CommonProperties
{
public string UniqueProperty1 { get; set; }
public override string X(string arg)
{
return X__A(arg);
}
}
I seriously hope my title is clear enough. If it's not I'm happy to have better suggestions.
The situation is thus (variable types are just examples):
public abstract class A
{
public virtual string X(string arg)
{
return "blarg";
}
}
public class CommonProperties : A
{
public string foof { get; set;} = "widget";
public string yay { get; set; }
public override string X(string arg)
{
return base.X(arg);
}
}
public class B : CommonProperties
{
public string UniqueProperty1 { get; set; }
public override string X(string arg)
{
return base.X(arg);
}
}
public class C : CommonProperties
{
public string UniqueProperty2 { get; set; }
public override string X(string arg)
{
return base.X(arg);
}
}
class D : A
{
public override string X(string arg)
{
return base.X(arg);
}
}
}
我正在概括我的问题。这不是我的实际代码。
问题是 C# 不允许抽象 classes 的多重继承,接口不允许默认代码(目前)也不允许默认初始化器。
我希望 CommonProperties 从抽象 class 派生,classes 从 it 派生(classes B和 C) 能够直接访问 X 函数的原始抽象 class 实现,而不是覆盖它的 CommonProperties 实现。我试过 base.base.X(arg) 但没有用。下一个最好的方法是让 classes B 和 C 从 class A and class CommonProperties 派生,但 C# 不允许这样做.使 class A 成为一个接口是行不通的,因为我有大量的 class 是从它派生出来的,这意味着我必须将需要的代码复制到每个接口中。单身的。一。由于对默认值的限制,我无法将 CommonProperties 设为接口。我可以将公共属性移动到它们派生的 classes 中,但这会破坏代码重用(我可能需要随着时间的推移添加额外的属性,这意味着更新会更慢并且更容易出错,等等)
我等不及 C# 8.0(理论上)具有函数的默认实现。如果我能让 B 和 C 直接访问被 CommonProperties.X() 函数隐藏的隐藏 A.X() 函数,那将是一个很好的解决方法。我怀疑后一种解决方案可以通过反射实现(实际上在我的项目中 A class 就是这样做的,所以这个话题对我来说并不难),但我想知道是否有更直接的方法。
编辑:再添加一个 class 以更好地阐明问题。我忘记了 CommonProperties 应该继承自 A 并且还显示 other classes 直接继承自 A.
您需要向 class A
添加一个调用 A.X
实现的非虚方法。方法名包含class名,我用双下划线分隔方法名和class名。
public abstract class A
{
public virtual string X(string arg)
{
return "blarg";
}
public string X__A(string arg)
{
return X(arg);
}
}
public class CommonProperties : A
{
public string foof { get; set;} = "widget";
public string yay { get; set; }
public override string X(string arg)
{
return "comarg";
}
}
public class B : CommonProperties
{
public string UniqueProperty1 { get; set; }
public override string X(string arg)
{
return X__A(arg);
}
}