派生 class 和派生字段。更改一些或所有属性值
Derived class and Derived field. Change a few or all properties values
我使用 C# 10 和 Net 6(简化代码):
public class DefaultsBase {
public Int32 Repeats { get; set; } = 10;
}
public abstract class StrategyBase {
public abstract String Name { get; }
public abstract DefaultsBase Defaults { get; }
}
public class MonthlyStrategy : StrategyBase {
public override String Name => "Monthly Strategy";
public override MonthlyStrategyDefaults Defaults = new MonthlyStrategyDefaults();
public String Street { get; }
private class MonthlyStrategyDefaults : DefaultsBase {
public Int32 Window { get; } = 20;
};
public MonthlyStrategy(String street, Action<MonthlyStrategyDefaults> defaultsConfiguration) {
defaultsConfiguration(Defaults);
Street = street;
}
}
我想要完成的是:
1 - 创建从 StrategyBase 派生的策略 类;
2 - 在每个 Strategy 中能够创建从 DefaulstBase 派生的 StrategyDefaults。
3 - 在构造函数中使用一个动作来更改一些或所有策略的默认值,包括 DefaultsBase 上的默认值。
我不确定我的实施是否有意义,而且我也遇到了错误:
public override MonthlyStrategyDefaults Defaults
> The modifier 'override' is not valid for this item
public MonthlyStrategy(String street, Action<MonthlyStrategyDefaults> defaultsConfiguration)
> Inconsistent accessibility:
parameter type 'Action<MonthlyStrategy.MonthlyStrategyDefaults>' is
less accessible than method 'MonthlyStrategy.MonthlyStrategy(string, Action<MonthlyStrategy.MonthlyStrategyDefaults>)
如何操作?
第一个错误
要覆盖基 class 中的 属性,它应该具有相同的 类型 和名称
public override MonthlyStrategyDefaults Defaults = new MonthlyStrategyDefaults();
改为
public override DefaultsBase Defaults = new MonthlyStrategyDefaults();
第二个错误
在 public 方法中 MonthlyStrategy
你尝试给它一个私有 class 作为参数 Action<MonthlyStrategyDefaults>
...调用者对象将如何实例化或处理私人class! ...
你有三个解决方案
- 更改
MonthlyStrategyDefaults
的可访问性并使其成为 public
- 或者您可以基于 class、
Action<DefaultsBase>
而不是 Action<MonthlyStrategyDefaults>
进行配置
- 或在内部进行所有配置
我使用 C# 10 和 Net 6(简化代码):
public class DefaultsBase {
public Int32 Repeats { get; set; } = 10;
}
public abstract class StrategyBase {
public abstract String Name { get; }
public abstract DefaultsBase Defaults { get; }
}
public class MonthlyStrategy : StrategyBase {
public override String Name => "Monthly Strategy";
public override MonthlyStrategyDefaults Defaults = new MonthlyStrategyDefaults();
public String Street { get; }
private class MonthlyStrategyDefaults : DefaultsBase {
public Int32 Window { get; } = 20;
};
public MonthlyStrategy(String street, Action<MonthlyStrategyDefaults> defaultsConfiguration) {
defaultsConfiguration(Defaults);
Street = street;
}
}
我想要完成的是:
1 - 创建从 StrategyBase 派生的策略 类;
2 - 在每个 Strategy 中能够创建从 DefaulstBase 派生的 StrategyDefaults。
3 - 在构造函数中使用一个动作来更改一些或所有策略的默认值,包括 DefaultsBase 上的默认值。
我不确定我的实施是否有意义,而且我也遇到了错误:
public override MonthlyStrategyDefaults Defaults
> The modifier 'override' is not valid for this item
public MonthlyStrategy(String street, Action<MonthlyStrategyDefaults> defaultsConfiguration)
> Inconsistent accessibility:
parameter type 'Action<MonthlyStrategy.MonthlyStrategyDefaults>' is
less accessible than method 'MonthlyStrategy.MonthlyStrategy(string, Action<MonthlyStrategy.MonthlyStrategyDefaults>)
如何操作?
第一个错误
要覆盖基 class 中的 属性,它应该具有相同的 类型 和名称
public override MonthlyStrategyDefaults Defaults = new MonthlyStrategyDefaults();
改为
public override DefaultsBase Defaults = new MonthlyStrategyDefaults();
第二个错误
在 public 方法中 MonthlyStrategy
你尝试给它一个私有 class 作为参数 Action<MonthlyStrategyDefaults>
...调用者对象将如何实例化或处理私人class! ...
你有三个解决方案
- 更改
MonthlyStrategyDefaults
的可访问性并使其成为 public - 或者您可以基于 class、
Action<DefaultsBase>
而不是Action<MonthlyStrategyDefaults>
进行配置
- 或在内部进行所有配置