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..