Tag: 接口

我该如何确保处理可能的一次性物品?

我正在开发一个.NET项目,它需要与一些用户定义的类进行交互 – 称为“作业”。 所有作业类必须按顺序实现特定的接口IJob ,以便库使用它们。 有时,作业类可能包含非托管资源,需要明确处理。 如果我事先不知道工作是否需要明确处理,我应该如何确保所有工作在使用后妥善处理? 我自己有一些想法,但是想听听你的意见/建议: 使IJob : IDisposable ,强制所有作业实现Dispose()方法。 这将允许我using块中的作业,但由于大多数作业不需要明确处理,这可能会给客户端开发人员带来不必要的混淆。 完成涉及try-finally块中的作业的所有工作,并finally使用以确保在作业实现IDisposable调用Dispose() 。 这使得客户端更容易实现新的作业类 – 不必实现空的Dispose()方法 – 但它也隐藏了库知道并关心可支配作业的事实。 写完这篇文章之后,我倾向于倾向于解决方案#1,但我仍然认为看到替代解决方案会更好,并且我已经考虑过两者的其他优缺点。

实现除抽象基类之外的常见行为?

在C#中,我有一个类层次结构,顶部附近有几个抽象基类,并且有相当多的派生类。 这些具体类中的一些具有一些相同实现的共同属性和方法。 它让我感到浪费,因此一个解决方案可能是在另一个抽象基类中实现这种常见行为。 abstract class Control; abstract class SquareControl: Control { public int SquarishProperty; public void SquarishMethod(); }; class Window: SquareControl; class Button: SquareControl; 但是,如果层次结构中的其他几个类共享某些其他行为,但是与另一个基类中的一个控件共享某些内容,该怎么办? 也许有很多共同点。 使用抽象基类实现对它进行建模是不切实际的吗? abstract class FlashableControl: Control { public int FlashyProperty; public void FlashMethod(); }; class StatusBar: FlashableControl; // but it’s also a bit square too, hmm… 那么如何在不使用基类的情况下跨类共享这样的实现呢? 我想我想将接口的实现委托给另一个类,并让该类代表所需的类实现这些属性和方法,这样对于用户来说,StatusBar和Window似乎支持标准接口,但是在涵盖它是实现它的其他东西。 我可以想象实现这种行为的聚合类,但这是否恰当,是否有任何陷阱? 有哪些替代方案? […]

返回自己类型的方法的接口

我有一个class级的情况 class Foo { Foo Bar() { return new Foo(); } } 现在我想为它创建一个界面 class IFoo { ??? Bar(); } 什么应该代替问号? 每个类都应该返回它自己的类型,而不是Foo。 以下解决方案有效,但看起来并不干净。 我不明白为什么我必须两次指定同一个类,并且当前类型没有类似“this”的东西 这是我以后使用它的方式 class GenericClass where T : IFoo { T foo = new T(); T item = foo.Bar(); }

为什么C#数组没有Count属性?

可能重复: 计数与集合中的长度与大小 真奇怪: C#数组如下 double[] test = new double[1]; 支持Length属性以获取数组的大小。 但是数组也实现了IList接口: IList list = test; 但是,IList接口还提供Count属性。 为什么arrays(在这种情况下为“测试”)没有? 编辑 :感谢所有人,他们指出它实际上是提供Count属性的ICollection接口(不是IList),而且这也是由于接口的显式实现。

在C#中强制通用接口实现

无论如何强制通用定义的约束来实现“通用接口”……也就是说,我希望类支持传递接口和限制它的generics类,以便类实现接口。 例如,如果我说: MyGenericClass.DoSomething(); 这应该受到限制,以便MyImplementation实现IMyInterface 据我所知,可以通过实现 public class Dynamic_Loader where S: T 现在,无论如何也迫使T成为一个界面? 编辑:这样做的目的是: private static List interfaceList = new List(); public static List InterfaceList {get { return interfaceList;}} public static void Add(S input) { interfaceList.Add(input);} 并且列表仅限于接口(因为它应该返回某些接口的实现)

C#hack:接口和抽象类之间的低级别差异

这是一个关于C#基础知识的哲学问题:我想知道完全抽象类可以模拟接口的接近程度。 假设我们有以下界面: public interface INativeInterface { void PerformAction(); String Property { get; set; } } 以及抽象类: public abstract class ISimulatedInterface { public abstract void PerformAction(); public abstract String Property { get; set; } } 他们有很多共同点,不是吗? 我所知道的差异是: 多重inheritance不适用于抽象类 显式实现不适用于抽象类 使用reflection或类似的东西可以跳过这些限制吗? 我意识到接口和抽象类在root中是不同的:接口声明了“ 可以表现得像 ”的条件,抽象类 – “ 是一种 ”,但即使这似乎是如此接近以至于这些实体之间的低级别差异要讨论的。 这个问题甚至可以听起来像“你会用C ++创建一个接口”。

如何为实现接口的类型要求没有参数的构造函数?

有办法吗? 我需要实现特定接口的所有类型都有一个无参数构造函数,可以这样做吗? 我正在为我公司的其他开发人员开发基本代码,以便在特定项目中使用。 有一个进程将创建执行某些任务的类型(在不同的线程中)的实例,我需要这些类型遵循特定的合同(ergo,接口)。 界面将在程序集内部 如果您对没有接口的情况有建议,我很乐意将其考虑在内……

将事件添加到接口/实现

知道以前曾经问过,但我的问题略有不同。 我有一个界面: IEmailDispatcher 它看起来像这样: public interface IEmailDispatcher { void SendEmail(string[] to, string fromName, string fromAddress, string subject, string body, bool bodyIsHTML, Dictionary Attachments); } 作为一点背景: 我有一个静态EmailDispatcher类,它具有以下方法:SendEmail(string [] to,string fromName,string fromAddress,string subject,string body,bool bodyIsHTML,Dictionary Attachments); 然后,通过IoC,加载相关的IEmailDispatcher实现,并调用该方法。 我的应用程序可以简单地调用EmailDispatcher.SendEmail(……… 我想向它添加事件,例如OnEmailSent,OnEmailFail等……这样每个实现都可以处理发送电子邮件的成功和失败,并相应地记录它们。 我该怎么做呢? 或者,还有更好的方法? 目前,我正在使用“BasicEmailDispatcher”,它基本上使用System.Net命名空间,创建MailMessage并发送它。 在将来,我将创建另一个类,以不同的方式处理邮件…将其添加到sql db表以进行报告等….因此将以不同的方式处理OnEmailSent事件到BasicEmailDispatcher

为新行为扩展(而不是更改)搜索类?

我正在更改提供数据的API(这是我原始问题的更新)。 某些搜索需要有关作者的数据并采用IAuthor对象。 API有一个IAuthor接口和一个实现IAuthor具体类,叫做Author 。 当作者被标记为小说家时,我需要改变Search.GetBooksByAuthor方法的行为以给出不同的语义。 我听说过开放/封闭原则 ,似乎改变IAuthor和/或Author和/或Search类会违反这一点(尽管Book类肯定保持不变)。 怎么做这个简单的改变? 例如,我最初在想这样的事情,但我的想法可能很糟糕,因为它涉及更改Search类: //Before class Search { public Books[] GetBooks(IAuthor author){ // Call data access GetBooks… } } //After class Search { public Books[] GetBooks(IAuthor author){ // To maintain pre-existing behaviour // call data access GetBooks method with SQL param @AsNovelist = false… // (or don’t pass anything because […]

通过.NET中的某种接口使属性可用于数据绑定?

我有一个以特定方式实现属性的类,以处理业务逻辑系统的一些自定义需求。 这种“特定方式”使得属性在数据绑定的上下文中不可操作。 基本上,如果我将类的对象放到表单上,数据绑定在对象上找不到任何内容,并且该对象的属性检查器虽然列出了属性,但不允许我编辑它们。 我想知道的是,如果有一个接口或类似的东西,我可以在我的类中实现,它将向表单设计器报告可以绑定的属性,并实现代表数据绑定系统所需的自定义代码。我的财产。 请注意,我不需要在属性检查器中编辑对象的属性值,这只是属性非function性的一个示例。 我只需要数据绑定支持。 是否有这样的界面,如果是这样,它是什么? 我们举一个简单的例子。 我们假设我有这个课程: public class CustomDataBinding : Component { private Dictionary _Properties = new Dictionary(); public CustomDataBinding() { _Properties[“Property1”] = 10; _Properties[“Property2”] = “Test”; } } 有没有什么我可以对我的对象做什么,没有实际制作属性,这将为这两个“属性”添加数据绑定支持? 请注意,对于我的真实类,我知道每个属性的类型,因此如果它更容易,请将上面的代码更改为仅使用字符串值: public class CustomDataBinding : Component { private Dictionary _Properties = new Dictionary(); public CustomDataBinding() { _Properties[“Property1”] = “Property1”; _Properties[“Property2”] = “Property2”; […]