这是我第一次碰到这个问题,这很奇怪,但是:
如何在C#接口中定义构造函数?
编辑
有些人想要一个例子(这是一个空闲时间项目,所以是的,这是一个游戏)
IDrawable
+ Update
+ Draw
为了能够更新(检查屏幕边缘等)并绘制自己,它总是需要一个GraphicsDeviceManager
.所以我想确保对象有引用它.这将属于构造函数.
现在,我写下来我想我在这里实施的IObservable
和GraphicsDeviceManager
应该采取的IDrawable
......看来要么我不明白的XNA框架或框架不是想出来的非常好.
编辑
在接口的上下文中,我对构造函数的定义似乎有些混乱.实际上不能实例化接口,因此不需要构造函数.我想要定义的是构造函数的签名.正如接口可以定义某个方法的签名,接口可以定义构造函数的签名.
由于Java 8允许在名为Default Methods的接口中默认实现方法,因此在何时使用a之间似乎存在混淆abstract class
.
那么什么时候应该使用与默认方法的接口,何时应该使用抽象类?抽象类在这种情况下仍然有用吗?
这是一个例子:
public interface IXMLizable<T>
{
static T newInstanceFromXML(Element e);
Element toXMLElement();
}
Run Code Online (Sandbox Code Playgroud)
当然这不会奏效.但为什么不呢?
其中一个可能的问题是,当您致电时会发生什么:
IXMLizable.newInstanceFromXML(e);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我认为它应该只调用一个空方法(即{}).所有子类都将被强制实现静态方法,因此在调用静态方法时它们都会很好.那么为什么这不可能呢?
编辑:我想我正在寻找比"因为这就是Java的方式"更深层次的答案.
是否有一个特殊的技术原因导致静态方法无法被覆盖?也就是说,为什么Java的设计者决定使实例方法可覆盖但不是静态方法?
编辑:我的设计的问题是我正在尝试使用接口来强制执行编码约定.
也就是说,界面的目标是双重的:
我希望IXMLizable接口允许我将实现它的类转换为XML元素(使用多态,工作正常).
如果有人想要创建一个实现IXMLizable接口的类的新实例,他们将始终知道将有一个newInstanceFromXML(Element e)静态构造函数.
除了在界面中添加评论之外,还有其他方法可以确保这一点吗?
编辑: 从Java 8开始,接口中现在允许使用静态方法.
在Java中设计并发线程时使用Runnable
和Callable
接口有什么区别,为什么要选择一个而不是另一个呢?
在我的一次访谈中,我被要求解释Interface和Abstract类之间的区别.
这是我的回答:
Java接口的方法是隐式抽象的,不能有实现.Java抽象类可以具有实现默认行为的实例方法.
在Java接口中声明的变量默认为final.抽象类可能包含非最终变量.
默认情况下,Java接口的成员是公共的.Java抽象类可以具有类似私有,受保护等类通常的类成员.
应使用关键字"implements"实现Java接口; 应使用关键字"extends"扩展Java抽象类.
接口只能扩展另一个Java接口,抽象类可以扩展另一个Java类并实现多个Java接口.
Java类可以实现多个接口,但它只能扩展一个抽象类.
然而,面试官并不满意,并告诉我这个描述代表了" 书本知识 ".
他告诉我一个更实际的回答,解释我何时会使用实际例子在界面上选择一个抽象类.
我哪里做错了?
是否应该使用实现接口方法的方法进行注释@Override
?
指示方法声明旨在覆盖超类中的方法声明.如果使用此批注类型注释方法但不覆盖超类方法,则编译器需要生成错误消息.
我不认为接口在技术上是超类.或者是吗?
这可能是一个通用的OOP问题.我想根据它们的用法在接口和抽象类之间进行一般性比较.
什么时候想要使用接口?何时想要使用抽象类?
我注意到,如果在接口上将参数指定为可选参数,则使用C#4中的可选参数,您不必在任何实现类上使该参数可选:
public interface MyInterface
{
void TestMethod(bool flag = false);
}
public class MyClass : MyInterface
{
public void TestMethod(bool flag)
{
Console.WriteLine(flag);
}
}
Run Code Online (Sandbox Code Playgroud)
因此:
var obj = new MyClass();
obj.TestMethod(); // compiler error
var obj2 = new MyClass() as MyInterface;
obj2.TestMethod(); // prints false
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么可选参数设计为这样工作?
一方面,我认为覆盖接口上指定的任何默认值的能力是有用的,但老实说,我不确定您是否应该能够在接口上指定默认值,因为这应该是一个实现决策.
另一方面,这种断开意味着您不能总是交替使用具体类和接口.当然,如果在实现上指定了默认值,那么这不是问题,但是如果你将具体类作为接口公开(使用一些IOC框架来注入具体的类),那么真的没有具有默认值的点,因为调用者无论如何都必须始终提供它.
我最近一直在努力研究PHP,我发现自己陷入了特质.我理解水平代码重用的概念,而不是必须从抽象类继承.我不明白的是,使用特征与接口之间的关键区别是什么?
我已经尝试过寻找一个体面的博客文章或解释何时使用其中一个的文章,但到目前为止我发现的例子看起来非常相似.
那里的任何人都可以就此分享他们的意见/观点吗?
interface ×10
java ×5
c# ×3
oop ×3
inheritance ×2
.net ×1
annotations ×1
c#-4.0 ×1
callable ×1
constructor ×1
java-8 ×1
php ×1
reflection ×1
runnable ×1
traits ×1