跨多个类存储公共设置的最佳模式

时间:2012-10-04 15:02:56

标签: c# inheritance multiple-inheritance

我正在创建两个用于访问自定义文件的单独类。我们打电话给我的班级MyReaderMyWriter

我遵循与StreamReaderStreamWriter之类的.NET类相同的模式,其中有一个单独的类用于读写。除了遵循既定的模式,这也为我解决了一些其他问题。

但是,我真的需要为读者和编写者类提供一些常用设置。例如,我有一个用户应该能够更改的分隔符。我还有一些固定数据,其中包含用于解析的常用信息。

有人建议一个好的模式,特别是遵循常见.NET框架实践的模式,为这样的多个类创建通用设置吗?我的类已经从.NET类继承。似乎多重继承可能是单向的,但在C#中似乎不支持。

(我正在使用Visual Studio 2012。)

4 个答案:

答案 0 :(得分:3)

public interface IStreamFilter
{
   string Delimiter {get; private set;}
   List<string> FilterCriteria {get; private set;}
}

public class StreamFilter : IStreamFilter
{
   public string Delimiter {get;}
   public List<string> FilterCriteria {get;}

   public void StreamFilter (string delimiter, List<string> filterCriteria)
   {
       this.Delimiter = delimiter;
       this.FilterCriteria = filterCriteria;
   }
}

您可以在Reader和Writer类的构造函数中传递IStreamFilter的实例。

 public class MyReader
 {
      private IStreamFilter _streamFilter;

      public MyReader(IStreamFilter streamFilter)
      {
           this._streamFilter = streamFilter;
      }

      public string ReadString()
      { 
          var readString = reader.GetString(x => x.Contains(this._streamFilter.Delimiter);
           // apply the filter for reading string
      }
 }   

在您想要实例化MyReader类的代码中的任何位置,您可以创建一个新的IStreamFilter实例,并根据用户首选项(假设来自用户配置文件)在构造函数中设置分隔符和其他过滤条件。然后将StreamFilter的实例传递给MyReader实例。这样,您可以动态自定义过滤器设置,而不依赖于单身人士。

答案 1 :(得分:1)

尝试使用接口。 interface的工作方式与abstract class类似,但只能包含要由实现它们的类“充实”的方法或属性定义。然后,类可以根据需要实现任意数量的接口。看看IEnumerable如何允许列表,词典和数组共享一组通用方法,允许它们在foreach中使用,或IDisposable允许类如何使用在using中声明。

我制作了一组墨水文本框控件,这些控件都应该从多个应用程序的用户配置中获取显示样式设置,因此我让他们从IInkInputSettings界面中获取这些设置并在所有应用程序中实现该界面UserConfig类。

或者,您可以通过Singleton实现全局配置:

public class GlobalConfig{
    /* your configuration properties here */
    private static GlobalConfig instance = null;
    public static GlobalConfig Instance{
        get{
            if(instance == null) instance=new GlobalConfig();
            return instance;
        }
    }
    private GlobalConfig(){ /* set default property values */ }
}

这比具有静态成员的静态类更好,因为它仅在您第一次使用它时才被实例化。

答案 2 :(得分:1)

这似乎是Singleton可能有道理的罕见情况之一:

public abstract class MyBase
{
    // This is the .NET class you're inheriting from, just putting it as a placeholder.
}

public class MyReader : MyBase
{
    private static readonly IMySettings settings = MySettings.Instance;
}

public class MyWriter : MyBase
{
    private static readonly IMySettings settings = MySettings.Instance;
}

internal interface IMySettings
{
    // Define your setting's properties, such as delimiter character.
}

internal sealed class MySettings : IMySettings
{
    private MySettings()
    {
    }

    public static IMySettings Instance
    {
        get
        {
            return Nested.Instance;
        }
    }

    // Implement your setting's properties, such as delimiter character.

    private static class Nested
    {
        private static readonly IMySettings instance = new MySettings();

        // Explicit static constructor to tell C# compiler not to mark type as beforefieldinit
        static Nested()
        {
        }

        public static IMySettings Instance
        {
            get
            {
                return instance;
            }
        }
    }
}

希望这有帮助。

答案 3 :(得分:1)

您可以使用基于构造函数的依赖项注入将设置类插入到类中。让IoC容器启动设置类(单例或不单例)并根据基类或接口注入它是很简单的。