假设我们有两个方法M1(),并M2()在接口.抽象类也有两个相同的抽象方法.如果任何类实现了此接口或从抽象类继承,则必须同时实现其中的方法.
所以对我来说,似乎我的场景中的接口或抽象类的行为相同.那么,任何人都可以在这个特定的情况下突出显示这两者之间的区别,并建议是否在这里使用抽象类或接口?
我不问这个 - > 为什么Java中没有多重继承,但允许实现多个接口?
在Java中,不允许多重继承,但是,在Java 8之后,Interfaces可以拥有默认方法(可以自己实现方法),就像抽象类一样.在此上下文中,还应允许多重继承.
interface TestInterface
{
// abstract method
public void square(int a);
// default method
default void show()
{
System.out.println("Default Method Executed");
}
}
Run Code Online (Sandbox Code Playgroud) 来自Eclipse/Java背景,我最喜欢的功能之一是能够快速存根接口所需的所有方法.在Eclipse中,我可以从源菜单中选择"覆盖/实现"来为接口的任何方法生成存根方法.
我想在Objective-C中做同样的事情.例如,如果我声明一个实现'NSCoding'协议的类,我想让Xcode自动生成实现此协议所需的方法.令我感到沮丧的是,我正在尝试实现的每个协议都需要查找然后复制/粘贴所需方法的签名.
我一直试图找出这是否可行,但还没有找到任何有希望的东西.这可能在XCode中吗?
几天前我接受了采访,并抛出了这样的问题.
问:反转链表.以下代码给出:
public class ReverseList {
interface NodeList {
int getItem();
NodeList nextNode();
}
void reverse(NodeList node) {
}
public static void main(String[] args) {
}
}
Run Code Online (Sandbox Code Playgroud)
我很困惑,因为我不知道接口对象可以用作方法参数.面试官解释了一下,但我仍然不确定.有人可以开导我吗?
众所周知,有些语言有接口的概念.这是Java:
public interface Testable {
void test();
}
Run Code Online (Sandbox Code Playgroud)
如何以最紧凑的方式在C++(或C++ 11)中实现这一点并且代码噪声很小?我很欣赏一个不需要单独定义的解决方案(让标题足够).这是一个非常简单的方法,即使我发现越野车;-)
class Testable {
public:
virtual void test() = 0;
protected:
Testable();
Testable(const Testable& that);
Testable& operator= (const Testable& that);
virtual ~Testable();
}
Run Code Online (Sandbox Code Playgroud)
这只是一个开始......而且已经超过了我想要的时间.怎么改进呢?也许在std命名空间的某个地方有一个基类专为此而设计?
在C#编程语言中, Krzysztof Cwalina在一个注释中说:
我们明确决定不添加对多重继承的支持[...]缺少多重继承迫使我们添加接口的概念,这反过来又导致了框架演化,更深层次的继承层次结构等问题.问题.
接口是OO编程语言的核心概念.我不遵循"强迫我们添加接口的概念"的含义
Krzysztof是否意味着必须就接口的使用做出某些设计决策,否则将使用多重继承?或者,他interface是否因为缺乏多重继承而被引入C#?你能提供一个例子吗?
instanceof可用于测试对象是否是给定类的直接或下降实例.instanceof即使接口无法像类一样实例化,也可以与接口一起使用.任何人都可以解释一下instanceof有效
我有一个界面:
interface TileSet {
fun contains(x: Int, y: Int) : Boolean
}
Run Code Online (Sandbox Code Playgroud)
我希望能够创建多组瓷砖(瓷砖是一对x和y整数坐标):
fun TileSet.union(another: TileSet) : TileSet =
// ..
Run Code Online (Sandbox Code Playgroud)
在Java 8中,我可以这样做:
@FunctionalInterface
public interface TileSet {
boolean contains(int x, int y);
public default TileSet unite(TileSet another) {
return (x, y) -> TileSet.this.contains(x, y) && another.contains(x, y);
}
}
Run Code Online (Sandbox Code Playgroud)
所以接口是用lambda实现的TileSet#unite().或者它可以用旧的匿名类方法实现:
public default TileSet unite(TileSet another) {
return new TileSet() {
@Override
public boolean contains(int x, int y) {
return TileSet.this.contains(x, y) && another.contains(x, y);
}
}
} …Run Code Online (Sandbox Code Playgroud) 简而言之,我有一个C#函数,它对作为Object实例传入的给定Type执行任务.传入类实例时,一切正常.但是,当对象被声明为接口时,我真的很想找到具体的类并对该类类型执行操作.
这是无处不在的坏例子(金属外壳不正确等等):
public interface IA
{
int a { get; set; }
}
public class B : IA
{
public int a { get; set; }
public int b { get; set; }
}
public class C : IA
{
public int a { get; set; }
public int c { get; set; }
}
// snip
IA myBObject = new B();
PerformAction(myBObject);
IA myCObject = new C();
PerformAction(myCObject);
// snip
void PerformAction(object myObject)
{
Type objectType = myObject.GetType(); // …Run Code Online (Sandbox Code Playgroud) 当我试着写这样的东西时:
public interface MyInterface {
static {
System.out.println("Hello!");
}
}
Run Code Online (Sandbox Code Playgroud)
编译器无法编译它.
但是当我写这样的东西时:
interface MyInterface {
Integer iconst = Integer.valueOf(1);
}
Run Code Online (Sandbox Code Playgroud)
并反编译它,我看到静态初始化:
public interface MyInterface{
public static final java.lang.Integer i;
static {};
Code:
0: iconst_1
1: invokestatic #1; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
4: putstatic #2; //Field i:Ljava/lang/Integer;
7: return
}
Run Code Online (Sandbox Code Playgroud)
你能告诉我这个行为吗?
interface ×10
java ×4
c# ×3
oop ×3
abstract ×2
c++ ×1
c++11 ×1
concrete ×1
ide ×1
inheritance ×1
instanceof ×1
java-8 ×1
kotlin ×1
objective-c ×1
polymorphism ×1
protocols ×1
types ×1
xcode ×1