我正在创建两个用于访问自定义文件的单独类。我们打电话给我的班级MyReader
和MyWriter
。
我遵循与StreamReader
和StreamWriter
之类的.NET类相同的模式,其中有一个单独的类用于读写。除了遵循既定的模式,这也为我解决了一些其他问题。
但是,我真的需要为读者和编写者类提供一些常用设置。例如,我有一个用户应该能够更改的分隔符。我还有一些固定数据,其中包含用于解析的常用信息。
有人建议一个好的模式,特别是遵循常见.NET框架实践的模式,为这样的多个类创建通用设置吗?我的类已经从.NET类继承。似乎多重继承可能是单向的,但在C#中似乎不支持。
(我正在使用Visual Studio 2012。)
答案 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容器启动设置类(单例或不单例)并根据基类或接口注入它是很简单的。