在C#中,何时应该使用接口,何时应该使用抽象类?决定因素是什么?
当您使用抽象类来实现接口时,Java中会发生奇怪的事情:某些接口的方法可能完全丢失(即既不存在抽象声明也不存在实际实现),但编译器不会抱怨.
例如,给定接口:
public interface IAnything {
void m1();
void m2();
void m3();
}
Run Code Online (Sandbox Code Playgroud)
以下抽象类在没有警告或错误的情况下快速编译:
public abstract class AbstractThing implements IAnything {
public void m1() {}
public void m3() {}
}
Run Code Online (Sandbox Code Playgroud)
你能解释一下原因吗?
我想我们所有人(当我们可以被打扰时!)评论我们的界面.例如
/// <summary>
/// Foo Interface
/// </summary>
public interface Foo
{
/// <summary>
/// Will 'bar'
/// </summary>
/// <param name="wibble">Wibble factor</param>
void Bar(string wibble);
}
Run Code Online (Sandbox Code Playgroud)
您是否也评论实施(也可能提供给客户,例如作为图书馆的一部分)?如果是这样,你如何管理保持两者同步?或者您只是添加"查看文档界面"评论?
谢谢
在阅读有关设计模式时,人们会发现这句话.
但是我不明白,有人可以帮我解释一下吗?
默认方法是我们的Java工具箱中一个不错的新工具.但是,我尝试编写一个定义default
该toString
方法版本的接口.Java告诉我这是禁止的,因为声明的方法java.lang.Object
可能不会被default
编辑.为什么会这样?
我知道存在"基类永远胜利"规则,因此默认情况下(pun;),方法的任何default
实现Object
都会被方法覆盖Object
.但是,我认为没有理由说明Object
规范中的方法不应该有例外.特别是对于toString
具有默认实现可能非常有用.
那么,Java设计者决定不允许default
方法覆盖方法的原因是什么Object
?
那么,明确实现接口的一个好用例究竟是什么?
是否仅仅是因为使用该类的人不必在intellisense中查看所有这些方法/属性?
是否可以将扩展方法应用于接口?(C#问题)
例如,这是为了实现以下目标:
创建ITopology界面
为此接口创建扩展方法(例如public static int CountNodes(this ITopology topologyIf))
然后在创建实现ITopology的类(例如MyGraph)时,它会自动拥有Count Nodes扩展.
这样,实现接口的类就不必具有与扩展方法中定义的类对齐的set类名.
如何检查某个类是否实现了接口?当有:
Character.Gorgon gor = new Character.Gorgon();
如何检查gor
实现Monster
接口?
public interface Monster {
public int getLevel();
public int level = 1;
}
public class Character {
public static class Gorgon extends Character implements Monster {
public int level;
@Override
public int getLevel() { return level; }
public Gorgon() {
type = "Gorgon";
}
}
}
Run Code Online (Sandbox Code Playgroud)
该方法是否getLevel()
被Gorgon
正确覆盖,因此它可以返回level
新gor
创建的?
我正在学习Java,并且发现接口可以有字段,这些字段是public static和final.到目前为止,我还没有看到这些例子.这些接口常量的一些用例有哪些,我可以在Java标准库中看到一些吗?
根据我的理解,如果在java中实现接口,则该接口中指定的方法必须由实现所述接口的子类使用.
我注意到在某些接口(如Collection接口)中有一些方法被注释为可选,但这究竟是什么意思?它抛出了我一点,因为我认为接口中指定的所有方法都是必需的?