我今天使用Eclipse的"拉接口"重构功能来创建基于现有类的接口.提供的对话框用于创建新接口的所有新方法作为"抽象"方法.
那有什么好处?
我认为你被允许将接口方法声明为抽象的这一事实是该语言的一个多余且无害的特性,并不特别鼓励.
为什么Eclipse会支持这样的风格,或者为什么有人会自愿选择这样做呢?
澄清:我不是在问为什么界面方法是抽象的,这很明显.我在问为什么会明确地选择将它们标记为抽象,因为如果它们在界面中它们仍然是抽象的.
我在解决界面中定义构造函数的工作方式时遇到了一些麻烦.我可能完全误解了一些事情.但是我已经寻找了很长一段时间的答案,我找不到与此相关的任何内容.
如何在TypeScript类中实现以下接口:
interface MyInterface {
new ( ... ) : MyInterface;
}
Run Code Online (Sandbox Code Playgroud)
Anders Hejlsberg在此视频中创建了一个包含类似内容的界面(大约14分钟).但对于我的生活,我无法在课堂上实现这一点.
我可能误解了一些事情,我没有得到什么?
编辑:
澄清.用"new(...)"我的意思是"任何东西".我的问题是我无法得到这个工作的最基本版本:
interface MyInterface {
new () : MyInterface;
}
class test implements MyInterface {
constructor () { }
}
Run Code Online (Sandbox Code Playgroud)
这不是为我编译我得到"类'测试'声明接口'MyInterface'但没有实现它:类型'MyInterface'需要一个构造签名,但类型'test'在尝试编译它时缺少一个.
编辑:
因此,在研究了这一点后,给出了反馈意见.
interface MyInterface {
new () : MyInterface;
}
class test implements MyInterface {
constructor () => test { return this; }
}
Run Code Online (Sandbox Code Playgroud)
是无效的TypeScript,这不能解决问题.您无法定义构造函数的返回类型.它将返回"测试".下面的签名:class test {constructor(){}}似乎是"new()=> test"(通过将"代码"粘贴在在线编辑器中,将鼠标悬停在"class"上获得).这就是我们想要的和我认为的.
任何人都可以在实际编译时提供此类或类似的示例吗?
编辑(再次......):
所以我可能想出了为什么可以在接口中定义它但不能在TypeScript类中实现的想法.以下工作:
var MyClass = (function () {
function MyClass() { }
return …
Run Code Online (Sandbox Code Playgroud) 我知道在接口中定义构造函数是不可能的.但我想知道为什么,因为我觉得它可能非常有用.
因此,您可以确保为此接口的每个实现定义了类中的某些字段.
例如,考虑以下消息类:
public class MyMessage {
public MyMessage(String receiver) {
this.receiver = receiver;
}
private String receiver;
public void send() {
//some implementation for sending the mssage to the receiver
}
}
Run Code Online (Sandbox Code Playgroud)
如果为这个类定义一个接口,以便我可以有更多的类来实现消息接口,那么我只能定义send方法而不是构造函数.那么我怎样才能确保这个类的每个实现都有一个接收器集呢?如果我使用像setReceiver(String receiver)
我这样的方法,我不能确定这个方法是否真的被调用.在构造函数中,我可以确保它.
可能重复:
为什么要优先选择Java类的接口?
我应该什么时候使用
List<Object> list = new ArrayList<Object>();
Run Code Online (Sandbox Code Playgroud)
ArrayList
继承自List
,所以如果某些功能ArrayList
不在List
,那么我将失去一些功能ArrayList
,对吧?编译器在尝试访问这些方法时会注意到错误?
你知道如何在Eclipse中按下F3一个方法会带你到它的声明吗?我有一个方法是接口的一部分; 点击F3这个自然会带我到声明界面.
显然,有一个实现此接口的对象,这是实际实现该方法的地方.我想,当我按下时F3,跳转到实现,而不是接口声明.我知道在编译时可能不知道实现,所以有没有办法让Eclipse向我展示实现接口的所有类,以便我可以选择要查看的实现方法?现在当发生这种情况时,我只是手动搜索这个以找到实现的方法.
我有一个现有的项目,它使用@Override
覆盖接口方法的方法,而不是超类方法.我不能在代码中改变这一点,但我想Eclpse停止抱怨的注解,因为我仍然可以使用Maven构建.
我该如何禁用此错误?
注意:由于项目要求,我需要编译Java 1.5.
我创建了一个带有一些属性的界面.
如果接口不存在,则类对象的所有属性都将设置为
{ get; private set; }
Run Code Online (Sandbox Code Playgroud)
但是,在使用接口时不允许这样做,这样可以实现,如果是这样,怎么办?
我在C#中的测试代码:
namespace DSnA
{
public abstract class Test : IComparable
{
}
}
Run Code Online (Sandbox Code Playgroud)
导致以下编译器错误:
error CS0535: 'DSnA.Test' does not implement interface member
'System.IComparable.CompareTo(object)'
Run Code Online (Sandbox Code Playgroud)
由于该类Test
是一个抽象类,为什么编译器要求它实现接口?这个要求不应该仅仅是具体课程的必修课吗?
我想知道一个类是否可以从类和接口继承.下面的示例代码不起作用,但我认为它传达了我想要做的事情.我想这样做的原因是因为我公司生产USB,串口,以太网等设备.我正在尝试开发一个通用组件/接口,我可以用它为我们所有的设备编写程序,这将有助于保持所有应用程序的常见事物(如连接,断开连接,获取固件)相同.
添加到这个问题:如果GenericDevice在不同的项目中,我可以将IOurDevices接口放在该项目中,然后如果我添加对第一个项目的引用,则使USBDevice类实现接口吗?因为想要引用一个项目,然后根据设备的不同实现不同的接口.
class GenericDevice
{
private string _connectionState;
public connectionState
{
get{return _connectionState; }
set{ _connectionState = value;}
}
}
interface IOurDevices
{
void connectToDevice();
void DisconnectDevice();
void GetFirmwareVersion();
}
class USBDevice : IOurDevices : GenericDevice
{
//here I would define the methods in the interface
//like this...
void connectToDevice()
{
connectionState = "connected";
}
}
//so that in my main program I can do this...
class myProgram
{
main()
{
USBDevice myUSB = new USBDevice();
myUSB.ConnectToDevice;
}
}
Run Code Online (Sandbox Code Playgroud) 前段时间,我遇到了一段代码,它使用了一些标准的Java功能来定位实现给定接口的类.我知道函数隐藏在某些非逻辑位置,但它们可以用于其他类,因为包含的名称是隐含的.那时我不需要它,所以我忘了它,但现在我做了,我似乎无法再找到这些功能.这些功能在哪里可以找到?
编辑:我不是在寻找任何IDE函数或任何东西,而是可以在Java应用程序中执行的东西.
interface ×10
java ×5
c# ×3
eclipse ×3
polymorphism ×2
abstract ×1
annotations ×1
asp.net ×1
class ×1
components ×1
constructor ×1
inheritance ×1
list ×1
syntax ×1
syntax-error ×1
typescript ×1