C# 如何组合派生类及其基类中类似的命名嵌套类
我在做一个小项目,为一个系统创建了附加组件的标准实现。这些标准实现将以统一的方式设置日志记录、配置等内容。所有这些都考虑到了可维护性和可重用性 现在我正在努力解决的问题是如何处理设置的名称。之前,我总是在中创建一个嵌套类C# 如何组合派生类及其基类中类似的命名嵌套类,c#,.net,inheritance,C#,.net,Inheritance,我在做一个小项目,为一个系统创建了附加组件的标准实现。这些标准实现将以统一的方式设置日志记录、配置等内容。所有这些都考虑到了可维护性和可重用性 现在我正在努力解决的问题是如何处理设置的名称。之前,我总是在中创建一个嵌套类Settings,声明了一些常量字符串值,如 public const string BananaSetting=“BananaSetting” 因此,我几乎再也不会拼写错误的设置的名称了 但是,我有一个基类,它应该有一个名为DEBUG的设置,用作一般的调试启用设置;但也包括特定
Settings
,声明了一些常量字符串值,如
public const string BananaSetting=“BananaSetting”代码>
因此,我几乎再也不会拼写错误的设置的名称了
但是,我有一个基类,它应该有一个名为DEBUG的设置,用作一般的调试启用设置;但也包括特定于附加组件的设置,这些设置仅针对该特定附加组件存在。
由于我将每个派生类基于具有调试设置嵌套类的类,因此任何试图声明名为Settings
的类似嵌套类的派生类都将触发编译器警告:
DerivedClass.Settings隐藏继承的成员“BaseClass.Settings”。如果要隐藏,请使用新关键字
但我不想隐瞒。我真正想做的是将两个设置类合并为一个。是否有任何方法可以做到这一点,或者是否有某种现有的设计模式可以正确做到这一点
public abstract class BaseClass
{
public class Settings
{
public const string BananaSetting = "BananaSetting";
}
public abstract void BaseAbstractMethod();
public void BaseMethod()
{
// intended use
var settingValue = settingsDictionary[Settings.BananaSetting];
}
}
public class DerivedClass : BaseClass
{
public class Settings
{
public const string DerivedBananaSetting = "DerivedBananaSetting";
}
public override void BaseAbstractMethod()
{
// intended use
var settingValue = settingsDictionary[Settings.BananaSetting];
var subSettingValue = settingsDictionary[Settings.DerivedBananaSetting];
}
}
像这样的东西怎么样:
public abstract class SettingBase
{
public abstract string GetSettingName();
public abstract SettingBase GetSetting();
//Shared Properties and Stuff here:
}
public class BananaSetting : SettingBase
{
public override string GetSettingName()
{
return nameof(BananaSetting);
}
public override SettingBase GetSetting()
{
return this;
}
//Banana-Specific Settings go here
}
public class DEBUGSetting : SettingBase
{
public override string GetSettingName()
{
return nameof(DEBUGSetting);
}
public override SettingBase GetSetting()
{
return this;
}
//DEBUG-Specific Settings go here
}
public class Program
{
public void Demo()
{
var settings = LoadSettings();
foreach(var setting in settings)
{
var implementation = setting.GetSetting();
if(implementation is DEBUGSetting dbg)
{
//access dbg.Properties here
}
[...]
}
}
}
如果我理解正确,您希望使用更多设置扩展基类:
public class SettingBase
{
public SettingDerived()
{
_settingNamesWithValues.Add("BananaSetting", new object());
}
private Dictionairy<string, object> _settingNamesWithValues = new Dictionairy<string, object>();
public Dictionairy<string, object>() SettingNamesWithValues
{
get
{
return _settingNameWithValue;
}
}
}
是否有必要将它们放在子类中?您可以通过以下方式轻松实现目标:
public abstract class BaseClass
{
public const string BananaSetting = "BananaSetting";
public abstract void BaseAbstractMethod();
public void BaseMethod()
{
}
}
public class DerivedClass : BaseClass
{
public const string DerivedBananaSetting = "DerivedBananaSetting";
public override void BaseAbstractMethod()
{
}
}
您需要在派生类中创建新的设置类,因为它与基类中的设置类具有相同的名称。要能够访问派生类中的基本设置,还需要继承嵌套的设置类:
public class DerivedClass : BaseClass
{
public new class Settings : BaseClass.Settings
{
public const string DerivedBananaSetting = "DerivedBananaSetting";
}
// etc..
您的其余代码不会更改。有关更多说明,请向我们展示一些代码。@HamedMoghadasi我在代码中添加了基本思想(这会导致编译器警告)。很有趣,但这将为每个设置创建一个类,这与我在加载项上有时可以使用的60多个设置相比有点过火。另外,如果可能的话,我希望设置类是嵌套的,这样它的常量就专门指向该插件类型的设置。我把它们放在嵌套类中的唯一原因是为了分组和可读性。我最初有这样的设置,但我无法通过查看代码(是的,我有一点OCD)轻松找到我使用设置的地方,找到设置。BananaSetting更容易,因为我想得到的颜色类名。可以理解,我已经将iakobski的答案标记为有用,因为他的答案作为解决方案更完整、更清晰。我将把我的放在这里,作为“另一种方法”,带有设置的字典来自我工作的框架,因此它已经允许我检索这样的设置。我试图做到的是,这样我就不会拼错设置的名称,因为在我各自的设置类中它们是常量字符串。只是为了再次检查,如果我要创建另一个派生自DerivedClass的类,并再次执行该技巧,我仍然可以访问基类的设置,对吗?是的,你会的DerivedClass.Settings
包含BaseClass.Settings
的所有公共成员,如果您再次派生,它们在层次结构上都是可用的。很好,刚刚测试过,它就像一个符咒。谢谢
public abstract class BaseClass
{
public const string BananaSetting = "BananaSetting";
public abstract void BaseAbstractMethod();
public void BaseMethod()
{
}
}
public class DerivedClass : BaseClass
{
public const string DerivedBananaSetting = "DerivedBananaSetting";
public override void BaseAbstractMethod()
{
}
}
public class DerivedClass : BaseClass
{
public new class Settings : BaseClass.Settings
{
public const string DerivedBananaSetting = "DerivedBananaSetting";
}
// etc..