标签: interface

鸭子打字与旧的"变种"类型和/或界面有何不同?

我一直看到"鸭子打字"这个短语大肆渲染,甚至还遇到了一两个代码示例.我懒得忙着做自己的研究,有人可以简单地告诉我:

  • 'duck type'和old-skool'变体类型'之间的区别,和
  • 提供一个示例,我可能更喜欢鸭子打字而不是变种打字,以及
  • 提供一个我必须使用duck typing来完成的事情的例子?

鸭子打字图由礼貌登记

通过怀疑这种"新"结构的力量,我不是故意要发怒的,而且我不会因为拒绝做研究而避开这个问题,但我正在喋喋不休地谈论我所看到的所有关于这个问题的大肆宣传.最近.它看起来像没有打字(也就是动态打字),所以我没有立即看到优势.

附录:感谢目前为止的例子.在我看来,使用类似'O-> can(Blah)'的东西相当于进行反射查找(可能并不便宜),和/或与编译器可能说的(O是IBlah)大致相同能够检查你,但后者的优点是区分我的IBlah界面和你的IBlah界面,而其他两个没有.当然,对于每种方法都有很多微小的接口会变得混乱,但是那样可以检查很多单独的方法......

...所以我再也没有得到它.在一个全新的麻袋中,它是一个梦幻般的节省时间,还是同样的老东西?需要鸭子打字的例子在哪里?

duck-typing interface variant

43
推荐指数
3
解决办法
3730
查看次数

当一个界面"继承"另一个界面时,你怎么称呼它?

如果我有B级:A {}

我说"B级继承了 A级"或"B级来自A级".

但是,如果我改为:

  class B : ISomeInterface   {}
Run Code Online (Sandbox Code Playgroud)

说"B继承ISomeInterface"是错误的 - 正确的术语是"B 实现 ISomeInterface".

但是,说我有

  interface ISomeInterface : ISomeOtherInterface   {}
Run Code Online (Sandbox Code Playgroud)

现在,说"继承"仍然是错误的,但现在说"实现"是错误的,因为ISomeInterface没有实现任何东西.

那么,你怎么称呼这种关系?

c# oop interface

43
推荐指数
4
解决办法
2万
查看次数

PHP:我可以在接口中使用字段吗?

在PHP中,我可以指定具有字段的接口,还是PHP接口仅限于函数?

<?php
interface IFoo
{
    public $field;
    public function DoSomething();
    public function DoSomethingElse();
}
?>
Run Code Online (Sandbox Code Playgroud)

如果没有,我意识到我可以在接口中公开一个getter作为函数:

public GetField();
Run Code Online (Sandbox Code Playgroud)

php interface

43
推荐指数
5
解决办法
4万
查看次数

结构,接口和拳击

可能重复:
结构实现接口是否安全?

拿这个代码:

interface ISomeInterface
{
    public int SomeProperty { get; }
}

struct SomeStruct : ISomeInterface
{
    int someValue;

    public int SomeProperty { get { return someValue; } }

    public SomeStruct(int value)
    {
        someValue = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我在某个地方这样做:

ISomeInterface someVariable = new SomeStruct(2);
Run Code Online (Sandbox Code Playgroud)

就是SomeStruct在这种情况下,盒装?

c# struct boxing interface value-type

43
推荐指数
3
解决办法
1万
查看次数

什么是"针对接口而不是对象的代码"的Python版本?

灵感来自一个很好的问题(和一堆很棒的答案).

语句"针对接口的代码,而不是对象"在Python中是否有任何意义?

我正在寻找像原始问题中的答案,但有Python片段和想法.

python oop interface inversion-of-control

43
推荐指数
3
解决办法
8300
查看次数

C#内部接口与内部实现

我发现了一些我不太懂的东西.

我有一个项目,我有一个内部接口.实现该接口的类也是内部的.在接口的实现中,我制作了我实现的所有成员,内部.我没有做一个明确的实现.

我有两个接口和两个类来实现这些工作正常的接口.

它看起来像这样:

internal interface IA
{
    void X();
}
Run Code Online (Sandbox Code Playgroud)

然后

internal class CA : IA
{
    internal void X()
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这适用于前面提到的两个类.但是当我尝试用另一个接口和类做它时,它不起作用.事实上,对于上面的例子,我得到错误:

'WindowsFormsApplication1.CA'没有实现接口成员'WindowsFormsApplication1.IA.X()'.'WindowsFormsApplication1.CA.X()'无法实现接口成员,因为它不是公共的.

我意识到我可以将方法公开或者做一个显式的实现(并省略内部和公共修饰符),但我只是混淆为什么它适用于它使用的两个类,但我似乎无法复制它在其他地方.

对代码进行一些屠杀(因为它是保密的),这是我项目中实际工作的代码之一.

internal interface IScanner
{
    void SetHardware(Hardware hardware);
    void Start();
    void PauseScan();
    void ResumeScan();
    void Stop();
    bool InScan { get; }
    event ScanCompleteHandler ScanComplete;
}
Run Code Online (Sandbox Code Playgroud)

然后我上课了:

internal class MyScanner : IScanner
{
    internal void SetHardware(Hardware hardware)
    {
       ...
    }

    internal void Start()
    {
        ...
    }

    internal void Stop()
    {
        ...
    }

    internal …
Run Code Online (Sandbox Code Playgroud)

c# interface internal

43
推荐指数
3
解决办法
4万
查看次数

Java泛型 - 使Generic扩展2个接口

你是如何做这项工作的:

public class Frankenstein<T extends IHuman, IMonster>{
}
Run Code Online (Sandbox Code Playgroud)

没有制作

public interface Weirdo extends Ihuman, IMonster{
}
Run Code Online (Sandbox Code Playgroud)

编辑

为什么这不起作用?

public <T> void mapThis(
        Class<? extends MyClass<T>> key, Class<? extends T & IDisposable> value) {

}
Run Code Online (Sandbox Code Playgroud)

我将编译器消息标记Class<? extends T & IDisposable>为错误.

java generics interface class

43
推荐指数
2
解决办法
5万
查看次数

什么时候应该使用接口?

我知道一个接口没有一个正文只是一个方法定义.但什么时候应该使用接口?如果我向某人提供一组没有正文的接口,为什么他们觉得需要编写函数体?他们最好用抽象方法编写自己的抽象类.

编辑:

我想当你是一个团队的一员时,使用Interfaces会更多.假设A队为某事写了一个代码,他们想看看是否调用了一个方法.使用名称getRecords(),是否完成.这将帮助B队编写提供给他们的界面的主体,B队必须保持方法名称相似,以便A队的代码运行.

只是一个想法.我可能错了.我认为Interfaces对单个开发人员没用.

编辑:

谢谢大家的答案.有了你们所回复的内容,我认为当你制作像API这样的东西时,接口有更多的用处?

oop interface

42
推荐指数
6
解决办法
4万
查看次数

如何创建由其他接口组成的接口?

我想创建一个接口,IFoo即基本上是一个自定义接口的组合,IBar和一些原生接口,ArrayAccess,IteratorAggregate,和Serializable.PHP似乎不允许实现其他接口的接口,因为我在尝试时遇到以下错误:

PHP解析错误:语法错误,意外的T_IMPLEMENTS,在Y行的X中期望'{'

我知道接口可以扩展其他接口,但PHP不允许多重继承,我无法修改本机接口,所以现在我卡住了.

我是否必须复制其中的其他接口IFoo,或者是否有更好的方法允许我重用本机接口?

php interface

42
推荐指数
2
解决办法
2万
查看次数

为什么我们不能在lambda表达式中使用默认方法?

在Java 8上阅读本教程,其中作者展示了代码:

interface Formula {
    double calculate(int a);

    default double sqrt(int a) {
        return Math.sqrt(a);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后说

无法从lambda表达式中访问默认方法.以下代码无法编译:

Formula formula = (a) -> sqrt( a * 100);
Run Code Online (Sandbox Code Playgroud)

但他没有解释为什么不可能.我运行了代码,它给出了一个错误,

不兼容的类型:公式不是功能接口`

那么为什么不可能或错误的含义是什么?该接口满足具有一种抽象方法的功能接口的要求.

java lambda interface java-8 default-method

42
推荐指数
3
解决办法
7698
查看次数