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

通过怀疑这种"新"结构的力量,我不是故意要发怒的,而且我不会因为拒绝做研究而避开这个问题,但我正在喋喋不休地谈论我所看到的所有关于这个问题的大肆宣传.最近.它看起来像没有打字(也就是动态打字),所以我没有立即看到优势.
附录:感谢目前为止的例子.在我看来,使用类似'O-> can(Blah)'的东西相当于进行反射查找(可能并不便宜),和/或与编译器可能说的(O是IBlah)大致相同能够检查你,但后者的优点是区分我的IBlah界面和你的IBlah界面,而其他两个没有.当然,对于每种方法都有很多微小的接口会变得混乱,但是那样可以检查很多单独的方法......
...所以我再也没有得到它.在一个全新的麻袋中,它是一个梦幻般的节省时间,还是同样的老东西?需要鸭子打字的例子在哪里?
如果我有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没有实现任何东西.
那么,你怎么称呼这种关系?
在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) 可能重复:
结构实现接口是否安全?
拿这个代码:
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在这种情况下,盒装?
我发现了一些我不太懂的东西.
我有一个项目,我有一个内部接口.实现该接口的类也是内部的.在接口的实现中,我制作了我实现的所有成员,内部.我没有做一个明确的实现.
我有两个接口和两个类来实现这些工作正常的接口.
它看起来像这样:
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) 你是如何做这项工作的:
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>为错误.
我知道一个接口没有一个正文只是一个方法定义.但什么时候应该使用接口?如果我向某人提供一组没有正文的接口,为什么他们觉得需要编写函数体?他们最好用抽象方法编写自己的抽象类.
我想当你是一个团队的一员时,使用Interfaces会更多.假设A队为某事写了一个代码,他们想看看是否调用了一个方法.使用名称getRecords(),是否完成.这将帮助B队编写提供给他们的界面的主体,B队必须保持方法名称相似,以便A队的代码运行.
只是一个想法.我可能错了.我认为Interfaces对单个开发人员没用.
谢谢大家的答案.有了你们所回复的内容,我认为当你制作像API这样的东西时,接口有更多的用处?
我想创建一个接口,IFoo即基本上是一个自定义接口的组合,IBar和一些原生接口,ArrayAccess,IteratorAggregate,和Serializable.PHP似乎不允许实现其他接口的接口,因为我在尝试时遇到以下错误:
PHP解析错误:语法错误,意外的T_IMPLEMENTS,在Y行的X中期望'{'
我知道接口可以扩展其他接口,但PHP不允许多重继承,我无法修改本机接口,所以现在我卡住了.
我是否必须复制其中的其他接口IFoo,或者是否有更好的方法允许我重用本机接口?
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)
但他没有解释为什么不可能.我运行了代码,它给出了一个错误,
不兼容的类型:公式不是功能接口`
那么为什么不可能或错误的含义是什么?该接口满足具有一种抽象方法的功能接口的要求.