【发布时间】:2023-03-05 14:37:02
【问题描述】:
我在默认配置中使用最新版本的 Visual Studio Community 2017,其中包含所有最新更新。
我正在编写一个系统来处理具有不同属性的项目。它们可能包含任何属性组合,每个属性都需要一个或多个数据成员和独特的功能来处理它们。为了让我(或任何开发人员)能够快速实现新功能并减少我必须编写的代码量,我使用了继承。
问题是每个提供数据和函数的子类都需要某些本质上是静态的数据,但是 c# 不允许覆盖静态成员。我的解决方案是覆盖基类成员,并在其 getter 方法中对数据进行硬编码,如下所示:
public class BaseClass
{
public abstract string name { get; }
public abstract Color color { get; }
public abstract string[] info { get; }
public abstract OtherClass[] otherClasses { get; }
}
public class SubClass : BaseClass
{
public override string name { get { return "flip flops"; } }
public override Color color { get { return Color.FromArgb(255, 0, 255, 255); } }
public override string[] info { get { return new string[] { "a", "b", "c" }; } }
public override OtherClass[] otherClasses {
get {
return new otherClass[] {
new OtherClass("hard"),
new OtherClass("coded"),
new OtherClass("data") }
}
};
}
正如您所见,有些成员是值类型,有些是类,有些是类数组。我担心的是,如果我有 1000 个子类实例,运行时环境将为每个类创建每个成员的唯一实例。这是完全没有必要的,因为每个数据都是相同的。颜色是一个结构体,因此是一个值类型,所以我不确定它是否会有不同的反应。
我已经尝试(并且确实)解决了已经使用另一个类的问题。 SubClassData 存储成员,每个 SubClass 引用一个通过类构造函数分配的 SubClassData。 SubClassData 类存储在一个大型静态数组中。首先,使用它可以在构造时将错误的 SubClassData 分配给 SubClass。更重要的是,这种模式将数据与感觉完全不自然的功能区分开来。我认为这些本质上是相同的问题。
目前我正在使用所示的第一种方法来实现该功能。我不确定这是否是微优化,c# 是否会处理这个问题,或者是否有更好的设计模式可以用来实现这一点,但感谢所有反馈:)
【问题讨论】:
-
您的实例属性获取器可以返回私有静态成员。值类型将被复制,但这是值类型的重点。
-
访问每个成员时将创建唯一值。运行时肯定不会优化数组创建,因为它不能证明有人不会修改这些数组之一(在这种情况下,成员将不再返回预期的元素)。这是避免返回可变集合的原因之一。
标签: c# .net inheritance optimization