- 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/
嗨,你能帮忙吗 xcode 在第 4 行说:(函数不透明返回类型被推断为“按钮”,它根据自身定义了不透明类型) 感谢您的帮助 <3 Button(action: { self.showingProfi
有人对什么是“不透明类型”有很好的解释吗?我在 CFBundleRef 的上下文中看到了这个术语,他们说:“CFBundleRef 不透明类型”。那是只读类型吗? 最佳答案 “不透明类型”是您没有st
我正在尝试正确解释来自对 URL 的 fetch 调用的响应,我认为这是一个 json 字符串。我已经根据此处的类似帖子尝试了许多变体,但没有什么可以让我使用有用的数据。这是一种尝试: fetch('
我正在编写一个哈希表,并且我正在使用一个不透明的指针来管理这个 ADT。这是我的代码的样子: 哈希表.h typedef struct hash_table *Hash_table; Hash_tab
我知道键是什么,我知道其他上下文中的不透明键是什么 - 但数据库上下文中的不透明键是什么? 最佳答案 这意味着它除了用于查找记录之外没有任何实际意义 - 它应该被视为任意数据,除了键入之外没有其他目的
在 PyQtGraph、GLScatterPlotItem 中,当点重叠时,我希望这些点不会将颜色混合在一起。我想看到最近的点,而不是后面的点。 我已经要求颜色不透明(alpha = 1.0),但是当
在 Cocoa 中,特别是 iPhone SDK,opaque 属性描述为: If opaque, the drawing operation assumes that the view fills
This question already has answers here: Youtube iframe wmode issue (9个答案) 7年前关闭。 上面的注释:这不是重复的问题! The
问候, 我想在表面 View 上放置一个图像。但是我希望图像是透明的,这样您就可以看到图像以及潜在的表面 View 。谁能建议我该怎么做? 最佳答案 这就是我在绘制形状之前的做法。 Bitmap bu
如何动态添加 wmode="opaque" 到已经显示的 embed 元素?在不重新加载元素的情况下,嵌入的内容不应丢失其状态。 仅使用 javascript 设置 wmode 属性是行不通的。 删除
我刚在那个网站上找到了一些东西:iphoneexamples.com .查看“显示图像”时,我发现了一些新东西。 myImage.opaque = YES;//为了性能显式不透明 有人可以给我解释一下
我希望我的表格单元格能够快速加载,因此我将单元格内的所有 UILabel 设置为不透明=YES;这很好,因为我也将背景设置为白色,看起来很正常。 当您单击单元格时,问题就出现了,因为这些标签的背景是白
在大多数有关在 Kubernetes 中使用 secret 的示例中,您都可以找到类似的示例: apiVersion: v1 kind: Secret metadata: name: mysecr
我有一个覆盖 drawRect 的 UIView 子类:以实现各种效果(渐变背景、具有不同半径的圆角等)。当我分析应用程序并在模拟器/仪器中启用颜色混合层时,此类的实例永远不会是绿色的,即使它只是绘制
Typescript 没有内置的 Opaque类型 like Flow does .所以我做了自己的定制Opaque类型: type Opaque = Type & {readonly __TYPE_
我使用以下脚本添加 wmode="opaque"来嵌入元素: jQuery("iframe[src], embed[src]").each(function () { jQuery(this)
在ffmpeg中有一个结构AVFrame描述解码的视频或音频数据。 它有一个空指针不透明。该文档声称它是“用于用户的一些私有(private)数据”。 这是什么意思?它可以用于传输任何附加数据作为每帧
假设我有一个抽象对象,可以由多个独立的插件作者实现。 (例如,错误数据库连接)我不希望我的位的消费者必须处理每个特定的插件类型。 我还想将解析配置文件的过程与实际初始化数据库插件和其他类似事情的过程分
我有两个如下所示的界面: class IThing { ... virtual IHandle* getHandle(void) = 0; virtual void useHa
我在 the documentation for a windows OS "DRIVER_OBJECT" 中看到驱动程序对象是部分不透明的。但是“部分不透明”是什么意思? 我猜这意味着只有 DRIV
我是一名优秀的程序员,十分优秀!