Questions tagged «interfaces»

有关接口相关设计注意事项的问题,例如接口编程。


8
在Java中实现接口时的默认vs Impl
阅读后包装名称应为单数还是复数?在我看来,我从未见过涉及我的宠儿之一的适当辩论:命名接口的实现。 假设您有一个Order旨在以各种方式实现的接口,但是在首次创建项目时只有初始实现。您是否选择DefaultOrder或OrderImpl或采取其他措施来避免错误的二分法?当出现更多实现时,您会怎么做? 最重要的是...为什么?

4
Model-View-Presenter实现思想
我试图很好地掌握如何在UI和模型之间实现良好的解耦,但是我在弄清楚究竟在哪里划分线时遇到了麻烦。 我一直在研究Model-View-Presenter,但不确定如何实现它。例如,我的视图有多个对话框。 是否应该有一个View类,其中包含每个对话框的实例?那么在这种情况下,对话框应如何与Presenter交互?即。如果单个对话框需要通过Presenter向模型请求数据,该对话框应如何获得对Presenter的引用?通过引用在施工期间提供给它的视图? 我在想也许视图应该是静态类?然后对话框GetView并从那里获取Presenter ... 我一直在考虑将其设置为具有View和Model所有权的Presenter(而不是具有拥有Presenter和Presenter具有Model的View的所有者),并且Presenter在View中注册事件的回调,但这似乎很多耦合性更高(或至少取决于语言)。 我试图: 使它尽可能地分离 理想情况下,可以将Presenter / Model与其他语言的视图结合起来(我还没有做过很多中间语言的工作,但是我知道void(void),至少可以将C#应用程序与C ++库... 保持代码干净简单 所以..有什么建议应该如何处理交互作用?


5
当不需要属性之一时实现接口
很简单。我正在实现一个接口,但是该类没有一个属性是必需的,实际上,不应使用该属性。我最初的想法是做一些类似的事情: int IFoo.Bar { get { raise new NotImplementedException(); } } 我想这本身没有错,但是感觉并不“正确”。有人遇到过类似情况吗?如果是这样,您是如何处理的?


4
为什么.equals()在Java中的类中时,为什么.compareTo()在接口中?
我想知道为什么类中有类似方法的同时.compareTo()在Comparable接口.equals中Object。在我看来,为什么.compareTo()没有这样的方法似乎是武断的Object类中。 要使用.compareTo(),您可以实现Comparable接口并根据需要实现.compareTo()方法。对于该.equals()方法,您只需在类中重写该方法,因为所有类都从Object该类继承。 我的问题是,为什么.compareTo()在您实现的接口中而不是在像这样的类中实现这样的方法Object?同样,为什么要.equals()在类中Object而不是在某些接口中实现该方法?

10
抽象类上的接口
我和我的同事对基类和接口之间的关系有不同的看法。我相信一个类不应实现接口,除非在需要实现接口时可以使用该类。换句话说,我喜欢看这样的代码: interface IFooWorker { void Work(); } abstract class BaseWorker { ... base class behaviors ... public abstract void Work() { } protected string CleanData(string data) { ... } } class DbWorker : BaseWorker, IFooWorker { public void Work() { Repository.AddCleanData(base.CleanData(UI.GetDirtyData())); } } DbWorker是获得IFooWorker接口的对象,因为它是该接口的可实例化实现。它完全履行了合同。我的同事更喜欢几乎相同的东西: interface IFooWorker { void Work(); } …

6
了解“编程接口”
我遇到过很多术语“编程为接口而不是实现”,我想我有点理解它的意思。但是我想确保我了解它的好处以及可能的实现。 “对接口进行编程”意味着,在可能的情况下,应该引用一个类的更抽象级别(一个接口,抽象类,有时甚至是某种超类),而不是引用一个具体的实现。 Java中的一个常见示例是使用: List myList = new ArrayList();代替ArrayList myList = new ArrayList();。 我对此有两个问题: 我想确保我了解这种方法的主要好处。我认为好处主要是灵活性。将对象声明为更高级的引用,而不是具体的实现,可以在整个开发周期和整个代码中提供更大的灵活性和可维护性。它是否正确?灵活性是主要好处吗? 还有更多的“编程接口”方法吗?还是“将变量声明为接口而不是具体的实现”是此概念的唯一实现? 我不是在谈论Java构造接口。我说的是OO原则:“编程为接口,而不是实现”。按照这个原理,世界“接口”是指一个类的任何“超类型” -接口,抽象类或简单的超类,它比更具体的子类更抽象,更不具体。

11
在与基类相同的文件中声明接口,这是一种好习惯吗?
为了可互换和可测试,通常具有逻辑的服务需要具有接口,例如 public class FooService: IFooService { ... } 在设计方面,我同意这一点,但是困扰我这种方法的一件事是,对于一项服务,您需要声明两件事(类和接口),而在我们的团队中,通常需要声明两个文件(一个用于类,一个用于接口)。另一个不适之处是导航困难,因为在IDE(VS2010)中使用“转到定义”将指向该接口(因为其他类均引用该接口),而不是实际的类。 我以为将IFooService与FooService放在同一文件中会减少上述怪异现象。毕竟,IFooService和FooService非常相关。这是一个好习惯吗?IFooService必须位于其自己的文件中有充分的理由吗?

9
接口命名:前缀“ Can-”与后缀“ -Able”
通常使用“ -able”作为接口的后缀,例如 可序列化可打印可枚举可饮用可射击可旋转 我以为'Can-'可能会更好,因为它可能更具描述性。是的,它比较罗y,给接口名称增加了干扰。特别地,可以使用被动动词。 例如,“ 1可射击”表示该物体能够射击(枪支可以实现这一目标),或者它可以被射击(目标板可以实现这一目标)。使用“ Can-”前缀,前者将为“ CanShoot”,后者将为“ CanBeShotAt”或“ CanShootAt”。 例如2文档“ CanBePrinted”和打印机“ CanPrint” 或者,我们应该坚持使用“ -Able”并让文档提供上下文吗? 任何意见。
29 api  interfaces 

2
以下(反)模式的名称是什么?它的优缺点是什么?
在过去的几个月中,我偶然发现了以下技术/模式。但是,我似乎找不到一个特定的名称,也不能百分百确定其所有优点和缺点。 模式如下: 在Java接口中,照常定义了一组常用方法。但是,使用内部类,默认实例会通过接口泄漏。 public interface Vehicle { public void accelerate(); public void decelerate(); public static class Default { public static Vehicle getInstance() { return new Car(); // or use Spring to retrieve an instance } } } 对我来说,最大的优势似乎在于,开发人员只需要了解接口,而无需了解其实现,例如,在他快速想要创建实例的情况下。 Vehicle someVehicle = Vehicle.Default.getInstance(); someVehicle.accelerate(); 此外,我已经看到该技术与Spring一起使用,以便根据配置动态提供实例。在这方面,它看起来也可以帮助模块化。 但是,我无法撼动这是滥用接口的感觉,因为它将接口与其实现之一结合在一起。(相关性反转原理等。)有人可以向我解释该技术的调用方式以及它的优缺点吗? 更新: 经过一段时间的考虑后,我重新检查并注意到,使用以下单例版本的模式的频率更高。在此版本中,公共静态实例通过接口公开,该接口仅初始化一次(由于字段为final)。另外,几乎总是使用Spring或将接口与实现分离的通用工厂来检索实例。 public interface Vehicle …

2
纯抽象类和接口的实现
尽管在C ++标准中这不是强制性的,但例如,GCC似乎通过在每个相关类的实例中都包含指向该抽象类的v表的指针来实现父类(包括纯抽象类)的方式。 自然,这通过其具有的每个父类的指针使该类的每个实例的大小膨胀。 但是我注意到许多C#类和结构都有很多父接口,它们基本上是纯抽象类。如果对say的每个实例Decimal都充满了指向所有各种接口的6个指针,我会感到惊讶。 因此,如果C#确实使用不同的接口,至少在典型的实现中,它如何实现它们(我知道标准本身可能没有定义这种实现)?在将纯虚拟父代添加到类时,是否有任何C ++实现都可以避免对象大小膨胀?

8
需要按特定顺序调用功能的接口设计
任务是根据一些输入规范在设备内配置硬件。这应该通过以下方式实现: 1)收集配置信息。这可能在不同的时间和地点发生。例如,模块A和模块B都可以(在不同时间)向我的模块请求一些资源。这些“资源”实际上就是配置。 2)在明确不再需要更多请求之后,需要将给出所请求资源摘要的启动命令发送到硬件。 3)只有在此之后,才能(并且必须)对所述资源进行详细配置。 4)另外,只有在2)之后,才能(并且必须)将所选资源路由到已声明的调用方。 导致错误的一个常见原因,即使是写这个东西的我来说,也是错误地遵循了这个顺序。我可以采用什么命名约定,设计或机制来使界面对第一次看到该代码的人可用?
24 c++  interfaces 

5
您如何改进和版本化接口?
假设您有一个界面IFoo: public interface IFoo { void Bar(string s); int Quux(object o); } 在API的第2版中,您需要Glarg向该接口添加方法。在不破坏现有API用户和保持向后兼容性的情况下,该如何做?这主要是针对.NET,但也可以应用于其他框架和语言。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.