【发布时间】:2021-08-02 04:44:50
【问题描述】:
这里是 OOP 的新手。我想让不同的配置类共享相同的加载和保存功能:
public abstract class AbstractConfig
{
[JsonIgnore]
public string FileName { get; private set; }
public void Save()
{
File.WriteAllText(FileName, JsonConvert.SerializeObject(this, Formatting.Indented, new JsonSerializerSettings() { ContractResolver = new SubstituteNullWithEmptyStringContractResolver() }));
}
public static T Load<T>(string fileName) where T : AbstractConfig
{
T instance = JsonConvert.DeserializeObject<T>(File.ReadAllText(fileName), new JsonSerializerSettings() { ContractResolver = new SubstituteNullWithEmptyStringContractResolver() });
instance.FileName = fileName;
return instance;
}
public AbstractConfig(string fileName)
{
this.FileName = fileName;
}
}
public class ConfigA : AbstractConfig
{
[JsonProperty("test1")]
public string Test1 { get; set; }
[JsonProperty("test2")]
public int Test2 { get; set; }
public static ConfigA Instance { get; set; }
public ConfigA(string fileName) : base(fileName)
{
}
}
public class ConfigB: AbstractConfig
{
[JsonProperty("test3")]
public int Test3 { get; set; }
[JsonProperty("test4")]
public string Test4 { get; set; }
public static ConfigB Instance { get; set; }
public ConfigB(string fileName) : base(fileName)
{
}
}
我可以这样保存:
ConfigA configA = new ConfigA("a.json");
// set values for config A
configA.Save();
ConfigB configB = new ConfigB("b.json");
// set values for config B
configB.Save();
但是为了加载,我需要这样做:
ConfigA configA = AbstractConfig.Load<ConfigA>("a.json");
ConfigB configB = AbstractConfig.Load<ConfigB>("b.json");
我想知道是否可以让它看起来像这样而不需要覆盖每个派生类中的加载函数:
ConfigA configA = ConfigA.Load("a.json");
ConfigB configB = ConfigB.Load("b.json");
我还想知道是否可以将单例Instance 和构造函数放入基类(我猜仍然会使用泛型?)所以我不需要为每个派生类编写它们。谢谢。
【问题讨论】:
-
abstract class AbstractConfig<T> where T:AbstractConfig<T>...public static T Load(...class ConfigA : AbstractConfig<ConfigA>... 然后你可以ConfigA.Load。 -
@JeremyLakeman 我试过了,它确实有效,但我不确定我是否完全理解
AbstractConfig<T> where T : AbstractConfig<T>部分是如何工作的。您能否详细说明答案(不发表评论),以便我可以选择它作为问题的答案? -
也称为“Curiously Recurring Template Pattern”zpbappi.com/curiously-recurring-template-pattern-in-csharp
-
@JeremyLakeman 哇从来不知道它的存在,谢谢提及!