- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设我有一个抽象对象,可以由多个独立的插件作者实现。 (例如,错误数据库连接)我不希望我的位的消费者必须处理每个特定的插件类型。
我还想将解析配置文件的过程与实际初始化数据库插件和其他类似事情的过程分开。
为此,我想到了这样的事情:
public interface IConfiguration
{
// No members
}
public interface IConnection
{
// Members go in here
void Create();
void Update();
void Delete();
}
public interface IConnectionProvider
{
// Try to interpret file as a configuration, otherwise return null
IConfiguration ParseConfiguration(Stream configurationContents);
IConnection Connect(IConfiguration settings);
}
public class ThingyRepository
{
// Lets say there is a constructor that initializes this with something
List<IConnectionProvider> providers;
// Insulates people from the actual connection provider
KeyValuePair<IConfiguration, IConnectionProvider> Parse(string filename)
{
IConnection result = null;
IConnectionProvider resultProvider = null;
foreach (var provider in this.providers)
{
using (Stream fs = OpenTheFileReadonly(filename))
{
IConnection curResult = provider.ParseConfiguration(fs);
if (curResult == null)
{
continue;
}
else
{
if (result == null)
{
result = curResult;
resultProvider = provider;
}
else
{
throw new Exception ("ambguity!");
}
}
}
}
if (result == null)
{
throw new Exception ("can't parse!");
}
return new KeyValuePair<IConfiguration, IConnectionProvider>(
result, resultProvider);
}
}
我的问题是,我有一个空接口(interface),它应该用作从指定文件加载的任何设置的不透明句柄。 IConnectionProvider 的特定实现者知道它需要从文件加载的配置中的哪些位,但该库的用户应该与该信息隔离。
但是我觉得有一个空的界面似乎很奇怪。这种事情有意义吗?还是我做错了什么?
最佳答案
没有成员的接口(interface)的基本概念,简单地将实现者标识为是某物,而不是接口(interface)的正常工作,即标识对象具有或做什么,被称为“标志接口(interface)” .它有它的用途,但要谨慎使用。例如,我通常以分层格式使用它们来识别应该持久保存到特定数据存储的域对象:
//no direct implementors; unfortunately an "abstract interface" is kind of redundant
//and there's no way to tell the compiler that a class inheriting from this base
//interface is wrong,
public interface IDomainObject
{
int Id {get;}
}
public interface IDatabaseDomainObject:IDomainObject { }
public interface ICloudDomainObject:IDomainObject { }
public class SomeDatabaseEntity:IDatabaseDomainObject
{
public int Id{get;set;}
... //more properties/logic
}
public class SomeCloudEntity:ICloudDomainObject
{
public int Id{get;set;}
... //more properties/logic
}
派生接口(interface)没有告诉我关于实现对象的结构的任何新信息,除了对象属于那个特定的子域,允许我进一步控制什么可以传递到哪里:
//I can set up a basic Repository pattern handling any IDomainObject...
//(no direct concrete implementors, though I happen to have an abstract)
public interface IRepository<T> where T:IDomainObject
{
public TDom Retrieve<TDom>(int id) where TDom:T;
}
//... Then create an interface specific to a sub-domain for implementations of
//a Repository for that specific persistence mechanism...
public interface IDatabaseRepository:IRepository<IDatabaseDomainObject>
{
//... which will only accept objects of the sub-domain.
public TDom Retrieve<TDom>(int id) where TDom:IDatabaseDomainObject;
}
可以在编译时检查生成的实现及其用法,以证明 ICloudDomainObject 没有传递到 IDatabaseRepository,并且在任何时候都不能将 String 或 byte[] 传递到存储库中进行存储。这种编译时安全性对于特性或属性是不可能的,这是将类“标记”为具有某些特殊意义的其他主要方法。
所以简而言之,这本身不是坏做法,但一定要问问自己,你想从标志接口(interface)中得到什么,并问问自己是否有任何状态或逻辑数据通常会在IConfiguration(可能是所述配置的名称或其他标识符,或者将其加载或保存到所选数据存储的方法)可以执行一些强制标准化。
关于c# - 没有成员的接口(interface)是否适合向图书馆用户指示 "opaque handle"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14449999/
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我想知道创建启动画面的最佳方法是什么(当您开始游戏时,公司 Logo 动画化)。我在 After Effects 中创建了一个 .mp4 启动画面,但找不到在 libgdx 中显示它的方法。创建启动画
我想知道如果登录请求 url 是如何发送 volley 登录请求 username:password http://login_url 以这种格式。如果有示例代码可用,那将是一个很大的帮助。目的是向
我需要在我们的系统中 gprof 一个库来检查函数调用,看看我们是否可以再优化它。基本上,我所拥有的是 使用共享库 myLib.so 的可执行文件 A 我想 gprof myLib.so。当我使用 -
我想在项目中使用 jetty 。我正在用Gradle构建它。 IntelliJ在下面的行中告诉“无法解决符号跳船” import org.eclipse.jetty.server.Server;如何解
我想编写转换器,让我完全控制将 PDF 转换为 ePUB?我正在寻找的是转换器 - 不应该把最后一行的词剪掉。如果一个文本是一个段落那么epub必须是一段没有任何额外的空间字符和切词。 -应该识别 p
我正在 libgdx 中制作一个自上而下的迷宫游戏,我使用 extendViewport 来渲染游戏相机。我对如何创建小 map 有点困惑。我应该为小 map 创建一个额外的视口(viewport)和
我正在尝试为 android 创建一个 epub 阅读器,所以经过大量搜索后我找到了 skyepub library (SDK)。似乎它具有我想要的所有功能。 我按照站点中的提示进行操作,但是在运行代
我正在尝试从 boost 库 ( http://www.boost.org/doc/libs/1_38_0/doc/html/program_options/tutorial.html#id37614
我正在创建一个菜单(就像那个飞扬的小鸟,当你死了它会在播放屏幕上弹出)。我创建了一个扩展表格的类,我想将表格的背景设置为白色。有办法做到这一点吗? 最佳答案 你可以这样做: Pixmap bgPixm
我在我的应用程序中使用 Picasso 库最新版本 2.4.0 来下载和缓存图像。大约有 25-30 张图像,每张大小为 300KB-400KB。我认为这绝不是一件大事或一件沉重的事情。 尽管应用程序
我即将编写一个宠物项目,其中部分功能依赖于从一台机器到另一台机器的通知。 工作流程是这样的: A 写了一些内容 A 按下按钮或说:“我完成了” B 立即获得更新 所以,我的第一个想法是,创建一个服务器
我目前是一名 C# 程序员,并且一直有兴趣学习更多有关 C++ 和数据结构的知识。我发现 CS106B 类(class)通过 Stanford Engineering Everywhere 计划免费在
阅读文档, 我发现以下内容: 1.9.1 1.8.4 1.8.2 A version of "1.8.2" select the obvious, fully-specified version. S
请我想知道当我们给 Nibobee 机器人提供电机速度时,我们在 AVR studio 中使用的单位是什么: motpwm_setLeft(1500); 1500 单位是多少? 最佳答案 根据the
我没有使用 boolean 值来查看一本书是否被 checkout ,而是我想用一个字符串来表示它是我想要的,但是当我调用该方法来 checkout 一本书时,该字符串适用于书籍对象的整个数组列表。我
我在使用 python 和 neurolab 方面还很陌生,我在训练前馈神经网络时遇到了问题。我建立了如下网络: net = nl.net.newff([[-1,1]]*64, [60,1]) net
给定一个 22 分钟(1320 秒) 的音频文件,Librosa 通过以下方式提取 MFCC 特征data = librosa.feature.mfcc(y=None, sr=22050, S=Non
我正在使用 naudio(使用教程)学习音频编程。我的程序 (C# .net winForms) 我有记录和停止按钮。代码如下所示: NAudio.Wave.WaveIn sourceStre
是否可以从自定义应用程序访问 iBooks 图书馆?喜欢用于音乐/视频的 MPMediaPickerController?或者可以访问与 iTunes 同步的书籍。谢谢 最佳答案 不,目前无法访问此信
我是一名优秀的程序员,十分优秀!