我可以看到人们一直在询问是否应该在下一版本的C#或Java中包含多重继承.有幸拥有这种能力的C++人说,这就像给某人一条绳子最终自我吊死.
多重继承有什么问题?有没有具体的样品?
我知道Java和C#中不允许多重继承.很多书只是说,不允许多重继承.但它可以通过使用接口来实现.没有讨论为什么不允许它.任何人都可以告诉我为什么不允许它?
我有2个类,一个包括methodA,另一个包括methodB.所以在一个新类中我需要覆盖方法methodA和methodB.那么如何在目标C中实现多重继承呢?我对语法有点困惑.
如果我有两个接口,两者的用途完全不同,但是使用相同的方法签名,我如何在不强制编写一个为两个接口服务的单个方法并在方法中编写一些复杂逻辑的情况下创建一个类.检查正在进行调用的对象类型并调用正确代码的实现?
在C#中,这被称为显式接口实现所克服.Java中有没有相同的方法?
class A { public: void eat(){ cout<<"A";} };
class B: virtual public A { public: void eat(){ cout<<"B";} };
class C: virtual public A { public: void eat(){ cout<<"C";} };
class D: public B,C { public: void eat(){ cout<<"D";} };
int main(){
A *a = new D();
a->eat();
}
Run Code Online (Sandbox Code Playgroud)
我理解钻石问题,上面的代码没有那个问题.
虚拟继承究竟是如何解决问题的?
我的理解:
当我说A *a = new D();,编译器想要知道类型的对象是否D可以分配给类型的指针A,但它有两个可以遵循的路径,但不能自己决定.
那么,虚拟继承如何解决问题(帮助编译器做出决定)?
c++ inheritance multiple-inheritance virtual-inheritance diamond-problem
JDK 8中的新功能允许您在保留二进制兼容性的同时添加到现有接口.
语法就像
public interface SomeInterface() {
void existingInterface();
void newInterface() default SomeClass.defaultImplementation;
}
Run Code Online (Sandbox Code Playgroud)
这种方式对于所有现有的实现,SomeInterface当它们升级到这个新版本时,它们并不会突然编译错误newInterface().
虽然这很简洁,但当你实现两个接口时会发生什么呢?两个接口都添加了一个你没有实现的新默认方法?让我举个例子来解释一下.
public interface Attendance {
boolean present() default DefaultAttendance.present;
}
public interface Timeline {
boolean present() default DefaultTimeline.present;
}
public class TimeTravelingStudent implements Attendance, Timeline {
}
// which code gets called?
new TimeTravelingStudent().present();
Run Code Online (Sandbox Code Playgroud)
这被定义为JDK 8的一部分了吗?
我发现Java神在这里谈论类似的东西http://cs.oswego.edu/pipermail/lambda-lib/2011-February/000068.html,但它是私人邮件列表的一部分,我不能直接问他们.
有关如何在JDK 8中使用默认值以及扩展Collection接口以支持lambdas的更多详细信息,请参阅此处:https: //oracleus.wingateweb.com/published/oracleus2011/sessions/25066/25066_Cho223662.pdf
我正在阅读"The Java Tutorial"(第二次).我刚刚完成了关于接口的部分(再次),但仍然不了解Java接口如何模拟多重继承.是否有比书中更清楚的解释?
一个简短的例子输出一个奇怪的结果!
#include <iostream>
using namespace std;
struct A { int a; };
struct B { int b; };
struct C : A, B
{
int c;
};
int main()
{
C* c = new C;
B* b = c;
cout << "The address of b is 0x" << hex << b << endl;
cout << "The address of c is 0x" << hex << c << endl;
if (b == c)
{
cout << "b is equal to c" << …Run Code Online (Sandbox Code Playgroud) 如果我们有一个继承自多个接口的类,并且接口具有相同名称的方法,那么我们如何在我的类中实现这些方法?我们如何指定实现哪个接口的方法?
我对这件事情仍然有些困惑.我到现在所发现的是
(这里已经提出了类似的问题,但我还有其他一些观点.)
接口是仅抽象方法和最终字段的集合.
Java中没有多重继承.
接口可用于在Java中实现多重继承.
继承的一个优点是我们可以在派生类中使用基类代码而无需再次编写它.可能这是继承在那里最重要的事情.
现在..
Q1.由于接口只有抽象方法(没有代码)所以我们怎么说如果我们实现任何接口那么它是继承?我们没有使用它的代码.
Q2.如果实现接口不是继承,那么如何使用接口来实现多重继承?
Q3.无论如何使用Interfaces有什么好处?他们没有任何代码.我们需要在我们实现它的所有类中反复编写代码.
那么为什么要制作接口呢?
注意:我找到了一个接口有用的案例.它的一个例子就像在Runnable接口中我们有public void run()方法,我们在其中定义线程的功能,并且内置编码,该方法将作为单独的线程运行.所以我们只需要编写线程中的代码,Rest是预定义的.但是这个东西也可以用抽象类和所有东西来实现.
那么使用接口的确切好处是什么?我们使用Interfaces实现了多重继承吗?
interface ×5
java ×5
inheritance ×4
c# ×2
c++ ×2
oop ×2
closures ×1
composition ×1
java-8 ×1
methods ×1
objective-c ×1
pointers ×1