如何让特定Communicator实例仅暴露对应读写方法
解决方案:通过接口分离实现读写方法隔离
核心思路是借助接口分离原则,将读、写操作拆分为独立接口,让底层的Communicator同时实现两个接口,再通过不同接口类型对外暴露实例,从而达到读属性仅显式Read方法、写属性仅显式Write方法的目的。
1. 定义读、写专属接口
创建两个单一职责的接口,分别封装读操作和写操作,同时保留公共属性的访问:
public interface ICardReader { int Port { get; } int Bit { get; } long Read(); } public interface ICardWriter { int Port { get; } int Bit { get; } long Write(bool[] values); }
2. 修改Communicator实现接口
让Communicator同时实现上述两个接口,保留原有业务逻辑:
public sealed class Communicator : ICardReader, ICardWriter { public int Port { get; private set; } public int Bit { get; private set; } public Communicator(int port, int bit) { Port = port; Bit = bit; } public long Read() { // 替换为实际读卡片逻辑 return 0; } public long Write(bool[] values) { // 替换为实际写卡片逻辑 return 0; } }
3. 调整ReadWrite类的属性返回类型
将读属性的返回类型改为ICardReader,写属性改为ICardWriter,外部调用时就只能看到对应接口的方法:
public sealed class ReadWrite { public ICardReader PortRead1 => new Communicator(0, 2); public ICardReader PortRead2 => new Communicator(3, 5); public ICardReader PortRead3 => new Communicator(6, 7); public ICardWriter PortWrite1 => new Communicator(1, 5); public ICardWriter PortWrite2 => new Communicator(1, 5); public ICardWriter PortWrite3 => new Communicator(1, 5); }
可选优化:限制Communicator的直接实例化
如果不想让外部代码直接创建Communicator实例,可以将其构造函数改为internal,仅允许同一程序集内的代码(比如ReadWrite类)创建:
public sealed class Communicator : ICardReader, ICardWriter { public int Port { get; private set; } public int Bit { get; private set; } // 改为internal构造,禁止外部直接实例化 internal Communicator(int port, int bit) { Port = port; Bit = bit; } // 读、写方法保持不变 }
通过这套实现,读属性的实例只能调用Read()方法和访问公共属性,写属性的实例只能调用Write()方法和访问公共属性,同时底层完全复用Communicator的逻辑。
内容的提问来源于stack exchange,提问作者Yaron Binder
相关产品推荐
相关产品推荐

