接口中的C#方法在不使用virtual
关键字的情况下声明,并在派生类中重写而不使用override
关键字.
是否有一个原因?我认为它只是一种语言方便,显然CLR知道如何处理这个问题(默认情况下方法不是虚拟的),但还有其他技术原因吗?
以下是派生类生成的IL:
class Example : IDisposable {
public void Dispose() { }
}
.method public hidebysig newslot virtual final
instance void Dispose() cil managed
{
// Code size 2 (0x2)
.maxstack 8
IL_0000: nop
IL_0001: ret
} // end of method Example::Dispose
Run Code Online (Sandbox Code Playgroud)
请注意,该方法virtual
final
在IL中声明.
我知道这是一个非常基本的问题,但是一位采访者以非常戏法的方式问我,我很无奈:(
我只知道接口的材料或理论定义,并且在我工作的许多项目中也实现了它.但我真的不明白为什么以及如何有用.
我也不了解界面中的一件事.即,例如,我们使用
conn.Dispose();
在最后一块.但我没有看到该类正在实现或继承IDisposable
interface(SqlConnection
)类我的意思.我想知道如何调用方法名称.同样,我不了解Dispose方法是如何工作的,因为我们需要使用我们自己的实现为所有接口方法实现函数体.接口如何被接受或命名为合同?到目前为止,这些问题一直在我心中滚动,坦率地说,我从来没有看到任何能以我能理解的方式解释我的问题的好线程.
MSDN像往常一样看起来非常可怕,没有一行是明确的(伙计们,善意的理由是谁进入高级开发,我强烈认为任何代码或文章应该达到任何人看到它的想法,因此像许多人说的那样,MSDN是没用的).
采访者说:
他有5种方法,他很乐意直接在课堂上实现它,但如果你必须选择抽象类或接口,你选择哪一种,为什么?我确实回答了他在各种博客中读到的所有内容,说明抽象类和界面的优缺点,但他不相信,他试图理解"为什么界面"."为什么抽象类"一般,即使我只能实现相同的方法一次而不是改变它.
我看不到网络中的任何地方,我可以得到一篇文章,可以清楚地解释我的接口及其功能.我是众多程序员中的一员,他们仍然不了解接口(我知道我使用的理论和方法)但不满意我清楚地理解它.
我一直在使用Guice的AOP来拦截一些方法调用.我的类实现了一个接口,我想注释接口方法,以便Guice可以选择正确的方法.即使注释类型使用Inherited annotation注释,实现类也不会继承Inherited的java doc中所述的注释:
另请注意,此元注释仅导致注释从超类继承; 已实现接口上的注释无效.
这可能是什么原因?了解对象类在运行时实现的所有接口并不是一件难事,因此必须有充分的理由支持这一决策.
这是一个语法问题.我有一个泛型类,它继承自泛型基类,并将约束应用于其中一个类型参数.我还希望派生类实现一个接口.对于我的生活,我似乎无法弄清楚正确的语法.
这就是我所拥有的:
DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar { ... }
Run Code Online (Sandbox Code Playgroud)
首先想到的是:
DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar, IFoo { ... }
Run Code Online (Sandbox Code Playgroud)
但这是不正确的,因为这导致T2需要实现IBar和IFoo,而不是DerivedFoo来实现IFoo.
我尝试了一些谷歌搜索,使用冒号,分号等,但我已经调整了.我确定答案很简单.
在接口中添加Javadoc注释并在实现中添加非Javadoc注释是否正确?
当您自动生成注释时,大多数IDE会为实现生成非JavaDoc注释.具体方法不应该有描述吗?
我的意思是:
interface B {...}
interface A extends B {...} // allowed
interface A implements B {...} // not allowed
Run Code Online (Sandbox Code Playgroud)
我用谷歌搜索它,我发现了这个:
implements
表示定义接口方法的实现.但是接口没有实现,所以这是不可能的.
但是,interface是100%抽象类,抽象类可以实现接口(100%抽象类)而不实现其方法.定义为"界面"时有什么问题?
详细说明
interface A {
void methodA();
}
abstract class B implements A {} // we may not implement methodA() but allowed
class C extends B {
void methodA(){}
}
interface B implements A {} // not allowed.
//however, interface B = %100 abstract class B
Run Code Online (Sandbox Code Playgroud) 好吧,我的一个朋友在编程中"界面"意味着来回走动.
什么是"界面"的最佳描述.
对我来说,一个接口是一个类的蓝图,这是最好的定义吗?
PHP接口允许在接口中定义常量,例如
interface FooBar
{
const FOO = 1;
const BAR = 2;
}
echo FooBar::FOO; // 1
Run Code Online (Sandbox Code Playgroud)
任何实现类都将自动提供这些常量,例如
class MyFooBar implement FooBar
{
}
echo MyFooBar::FOO; // 1
Run Code Online (Sandbox Code Playgroud)
我对此的看法是,任何Global都是邪恶的.但我想知道接口常量是否同样适用.鉴于对接口的编码通常被认为是良好的做法,使用接口常量是在类上下文之外使用的唯一常量吗?
虽然我很想听听您的个人意见以及您是否使用界面常量,但我主要是在您的答案中寻找客观原因.我不希望这是一个民意调查问题.我对使用接口常量对可维护性有什么影响感兴趣.耦合.或单元测试.它与SOLID PHP有什么关系?它是否违反了任何被认为是PHP良好实践的编码原则?你明白了......
注意: Java有一个类似的问题列出了一些很好的理由,说明它们是Bad Practice,但由于Java不是PHP,我认为再次在PHP标记中提出它是合理的.
ES6在Node 4中完全可用.我想知道它是否包含定义方法合同的接口概念,如MyClass implements MyInterface
.
我用谷歌搜索找不到多少,但也许有一个很好的技巧或解决方法可用.
interface ×10
java ×4
c# ×3
inheritance ×3
oop ×3
abstract ×1
abstraction ×1
annotations ×1
class ×1
comments ×1
constants ×1
constraints ×1
definition ×1
ecmascript-6 ×1
generics ×1
guice ×1
javadoc ×1
javascript ×1
methods ×1
node.js ×1
php ×1