4

我正在创建两个单独的类来访问自定义文件。让我们调用我的类MyReaderMyWriter.

我遵循与 .NET 类(例如StreamReaderStreamWriter遵循)相同的模式,其中有一个单独的类用于读取和写入。除了遵循既定模式之外,这还为我解决了一些其他问题。

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

有人可以提出一个好的模式,尤其是遵循常见的 .NET 框架实践的模式,为这样的多个类创建通用设置吗?我的类已经继承自 .NET 类。似乎多重继承可能是一种方式,但在 C# 中似乎不受支持。

(我使用的是 Visual Studio 2012。)

4

4 回答 4

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 实例。这样,您可以在不依赖 Singleton 的情况下即时自定义过滤器设置。

于 2012-10-04T16:08:10.117 回答
1

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

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

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

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 */ }
}

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

于 2012-10-04T15:08:55.117 回答
1

这似乎是单例可能有意义的罕见情况之一:

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;
            }
        }
    }
}

希望这可以帮助。

于 2012-10-04T15:20:57.280 回答
1

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

于 2012-10-04T15:24:18.263 回答