Tag: 接口

为什么不能用指针接收器来实现接口

我很困惑,为什么这不能编译: 不可能的types断言:Faz没有实现Foo(Bar方法有指针接收器) 如果我使接收器Faz.Bar Faz值而不是一个Faz指针,然后它编译好,但我认为总是有更好的指针接收器,所以值不被复制? package main import ( "log" ) func main() { foo := New().(Faz) log.Println(foo) } type Foo interface { Bar() string } func New() Foo { return &Faz{} } type Faz struct { } func (f *Faz) Bar() string { return `Bar` }

接口和asynchronous方法

我有一个应用程序。 此应用程序使用一个接口来访问数据库。 这个接口可以由许多类来实现。 例如,一个使用EF 4.4,但其他类可以使用更有效的EF5。 在将来也许我会使用EF6,因为它使用asynchronous方法。 在这个例子中,所有的方法都使用EF,但也可以使用其他方法。 应用程序编码一次,使用接口,并根据configuration文件,使用一个实现或其他,所以我只需要修改代码在一个地方,构造函数,在类的实例化中添加新的选项分配给接口。 目前所有类的方法都不是async ,但是将来如果我使用EF6,我想使用asynchronous方法,所以我不知道是否有可能使用EF6的类并实现了接口可以使用async方法。 对于EF6的asynchronous方法,我会使用async / awiat模式,所以在我的类的方法中,我需要使用async属性。 当我调用EF6的asynchronous方法时,这让我使用await关键字。 但是这个类可以实现第一次使用同步方法的接口吗? 有没有办法在主应用程序中使用许多实现而不需要修改代码? 一些实现将使用asynchronous方法,而其他实现将是同步的。

强制类重写.equals方法

我有一堆实现了一个通用接口的类:Command。 而这一堆class去了一个地图。 为了使地图工作正常,我需要实现Command的每个类来覆盖Object.equals(Object other)方法。 没关系。 但是我想强迫平等的压倒一切。 =>执行命令的人不会覆盖等于编译错误。 这可能吗? 编辑:顺便说一句,我还需要强制重写hashcode …

toString(),equals()和hashCode()

所以,我有一个需要实现的一堆方法的接口,方法名称是不相关的。 实现这个接口的对象通常被放入集合中,并且还有我希望它们使用的特殊的toString()格式。 所以,我认为将hashCode(),equals()和toString()放入界面会很方便,以确保我记得覆盖这些的默认方法。 但是,当我将这些方法添加到接口时,如果我没有实现这三个方法,那么IDE /编译器就不会抱怨,即使我明确地将它们放在接口中。 为什么这不会被强制执行? 它抱怨说,如果我不执行任何其他方法,但它不执行这三个。 是什么赋予了? 任何线索?

为什么要使用接口,多inheritance与接口,接口的好处?

我仍然对这件事有些困惑。 我到现在为止发现的是 (类似的问题已经在这里被问到,但我还有其他一些观点。) 接口是唯一抽象方法和最终字段的集合。 Java中没有多重inheritance。 接口可以用来在Java中实现多重inheritance。 inheritance的一个优点是我们可以在派生类中使用基类的代码,而不需要再次编写它。 可能这是inheritance的最重要的事情在那里。 现在.. Q1。 由于接口只有抽象方法(无代码),所以我们怎么说如果我们正在实现任何接口,那么它是inheritance? 我们没有使用它的代码。 Q2。 如果实现一个接口不是inheritance,那么如何使用接口来实现多inheritance? Q3。 无论如何,使用接口有什么好处? 他们没有任何代码。 我们需要在我们实现它的所有类中一遍又一遍地编写代码。 那为什么要做接口? 注意:我发现了一个界面有帮助的例子。 其中一个例子就像在Runnable接口中我们有public void run()方法,在这个方法中我们定义了线程的function,并且在编码中内置了这个方法将作为一个单独的线程来运行。 所以我们只需要编码在线程中做什么,Rest是预定义的。 但是这个东西也可以用抽象类来实现。 那么使用接口有什么好处呢? 我们使用接口实现的是多重inheritance吗?

一个接口方法可以有一个正文?

我知道一个接口就像是一个100%纯粹的抽象类。 所以,它不能有方法的实现。 但是,我看到一个奇怪的代码。 任何人都可以解释吗? 代码片段: interface Whoa { public static void doStuff() { System.out.println("This is not default implementation"); } } 编辑: 我的IDE是Intellij Idea 13.1。 项目SDK是java 7 <1.7.0_25>。 IDE没有显示任何编译器错误。 但是,当我在命令行编译代码时,我收到以下消息。 Whoa.java:2: error: modifier static not allowed here public static void doStuff() { ^

使用标记接口而不是属性的令人信服的理由

在Stack Overflow之前我们已经讨论过 ,我们应该更喜欢属性到标记接口 (没有任何成员的接口)。 MSDN上的界面devise文章也强调了这个build议: 避免使用标记界面(没有成员的界面)。 自定义属性提供了一种标记types的方法。 有关自定义属性的更多信息,请参阅编写自定义属性。 自定义属性是首选的时候,你可以推迟检查的属性,直到代码执行。 如果你的情况需要编译时间检查,你不能遵守这个准则。 甚至有一个FxCop规则来执行这个build议: 避免空接口 接口定义提供行为或使用合同的成员。 接口所描述的function可以被任何types所采用,而不pipetypes在inheritance层次中出现的位置。 一个types通过为接口的成员提供实现来实现一个接口。 一个空的接口没有定义任何成员,因此,没有定义一个可以实现的合同。 如果您的devise包含types预期要实现的空接口,那么您可能使用接口作为标记,或者识别一组types。 如果此标识在运行时发生,则正确的方法是使用自定义属性。 使用属性的存在或不存在或属性的属性来标识目标types。 如果标识必须在编译时发生,那么使用空的接口是可以接受的。 本文只说明一个原因,您可能会忽略该警告:当您需要types的编译时间标识。 (这与界面devise文章一致)。 如果在编译时使用接口来标识一组types,那么从这个规则中排除警告是安全的。 下面是实际的问题:微软在框架类库的devise(至less在几个情况下)不符合他们自己的build议: IRequiresSessionState接口和IReadOnlySessionState接口 。 ASP.NET框架使用这些接口来检查是否应该为特定处理程序启用会话状态。 显然,它不用于types的编译时识别。 为什么他们不这样做? 我可以想到两个潜在的原因: 微优化:检查一个对象是否实现了一个接口( obj is IReadOnlySessionState )比使用reflection检查一个属性( type.IsDefined(typeof(SessionStateAttribute), true) )要快。 大部分时间差别可以忽略不计,但对于ASP.NET运行时中性能至关重要的代码path来说,这可能是非常重要的。 但是,他们可能使用的解决方法就像caching每个处理程序types的结果。 有趣的是,ASMX Web服务(具有类似的性能特征)实际上使用WebMethod属性的EnableSession属性来达到此目的。 实现接口的可能性比用第三方.NET语言装饰属性的types更有可能被支持。 由于ASP.NET被devise为与语言无关,并且ASP.NET根据<%@ Page %> EnableSessionState <%@ Page %>指令 ,使用接口而不是属性可能更有意义。 什么是使用标记接口而不是属性的说服力的原因? 这只是一个(过早的)优化或框架devise中的一个小错误? (他们认为reflection是“红眼睛的大怪物”吗?)思考?

最小起订量 – 如何模拟一个接口需要被转换到另一个接口?

我想要做的是构build一个moq为I1 – 这是很好的…但是在方法的过程中,我正在testing使用这个模拟我需要把它投到I2为了访问一些属性不是I1 Interface I1 { int AProperty{get;set;}} Interface I2 {int AnotherProperty{get;set;}} 然后我有一些物体 Class O1 : I1 {} 和 Class O2 : O1 , I2 {} 问题是当我有一个I2实现对象的实例时,我可以将它转换为I1,以便访问通过该接口实现的方法。 在代码中,这不是一个问题,everythign按预期工作。 在这个类上写unit testing时唯一的问题就出现了。 接口还公开了一个名为GetNewInstance的方法,该方法将实现对象的初始化实例返回到IGetNewInstance接口中…我通常可以嘲笑它并使其自身返回(所以我继续使用模拟对象)。 然而,当你试图把这个I2types的返回对象强制转换为I1时,会产生一个空引用结果 – 这是有道理的,因为实现I2的模拟对象并不inheritance任何inheritanceI1的对象。 问题是我怎样才能强制模拟对象同时从I1 I2 I2同时inheritance?

如何在Python中扩展一个类?

在Python中,你如何扩展一个类? 例如,如果我有 color.py class Color: def __init__(self, color): self.color = color def getcolor(self): return self.color color_extended.py import Color class Color: def getcolor(self): return self.color + " extended!" 但是这不起作用…我期望如果我在color_extended.py工作,那么当我制作一个颜色对象并使用getcolor函数时,它将返回string“extended!”的对象。 到底。 也应该从import中得到初始化。 假设python 3.1 谢谢

如何编写接口的junittesting?

为接口编写junittesting的最好方法是什么,以便它们可以用于具体的实现类? 你有这个接口和实现类: public interface MyInterface { /** Return the given value. */ public boolean myMethod(boolean retVal); } public class MyClass1 implements MyInterface { public boolean myMethod(boolean retVal) { return retVal; } } public class MyClass2 implements MyInterface { public boolean myMethod(boolean retVal) { return retVal; } } 你将如何写一个testing对接口,所以你可以使用它的类? 可能性1: public abstract class MyInterfaceTest { public […]