我是Python面向对象编程的新手,我很难理解super()函数(新样式类),尤其是涉及多重继承时.
例如,如果你有类似的东西:
class First(object):
def __init__(self):
print "first"
class Second(object):
def __init__(self):
print "second"
class Third(First, Second):
def __init__(self):
super(Third, self).__init__()
print "that's it"
Run Code Online (Sandbox Code Playgroud)
我没有得到的是:Third()该类是否会继承构造函数方法?如果是,那么将使用super()运行哪一个?为什么?
如果你想运行另一个怎么办?我知道它与Python方法解析顺序(MRO)有关.
由于多重继承是不好的(它使源更复杂),C#不直接提供这样的模式.但有时候拥有这种能力会有所帮助.
例如,我能够使用接口和三个类来实现缺少的多继承模式:
public interface IFirst { void FirstMethod(); }
public interface ISecond { void SecondMethod(); }
public class First:IFirst
{
public void FirstMethod() { Console.WriteLine("First"); }
}
public class Second:ISecond
{
public void SecondMethod() { Console.WriteLine("Second"); }
}
public class FirstAndSecond: IFirst, ISecond
{
First first = new First();
Second second = new Second();
public void FirstMethod() { first.FirstMethod(); }
public void SecondMethod() { second.SecondMethod(); }
}
Run Code Online (Sandbox Code Playgroud)
每次我向其中一个接口添加方法时,我都需要更改类FirstAndSecond.
有没有办法将多个现有类注入一个新类,就像在C++中一样?
也许有一种使用某种代码生成的解决方案?
或者它可能看起来像这样(假想的c#语法):
public class FirstAndSecond: IFirst from First, ISecond …Run Code Online (Sandbox Code Playgroud) 为了完全理解如何解决Java的多重继承问题,我有一个经典的问题需要澄清.
可以说我有类Animal此有子类Bird和Horse我需要做一个类Pegasus,从扩展Bird和Horse自Pegasus既是一只鸟和一匹马.
我认为这是经典的钻石问题.从我能理解经典的方式来解决,这是使Animal,Bird和Horse类接口,并实现Pegasus从他们.
我想知道是否有另一种方法来解决我仍然可以为鸟类和马创造物体的问题.如果有一种方法可以创造动物,那将是伟大的但不是必要的.
java oop multiple-inheritance diamond-problem multiple-interface-implem
我有一个通用的界面
public interface Consumer<E> {
public void consume(E e);
}
Run Code Online (Sandbox Code Playgroud)
我有一个类消耗两种类型的对象,所以我想做类似的事情:
public class TwoTypesConsumer implements Consumer<Tomato>, Consumer<Apple>
{
public void consume(Tomato t) { ..... }
public void consume(Apple a) { ...... }
}
Run Code Online (Sandbox Code Playgroud)
显然我做不到.
我当然可以自己实施调度,例如
public class TwoTypesConsumer implements Consumer<Object> {
public void consume(Object o) {
if (o instanceof Tomato) { ..... }
else if (o instanceof Apple) { ..... }
else { throw new IllegalArgumentException(...) }
}
}
Run Code Online (Sandbox Code Playgroud)
但我正在寻找泛型提供的编译时类型检查和调度解决方案.
我能想到的最好的解决方案是定义单独的接口,例如
public interface AppleConsumer {
public void consume(Apple a);
} …Run Code Online (Sandbox Code Playgroud) Mixins和Traits有什么区别?
根据维基百科,Ruby模块有点像特征.怎么会这样?
假设我有一个多继承场景:
class A(object):
# code for A here
class B(object):
# code for B here
class C(A, B):
def __init__(self):
# What's the right code to write here to ensure
# A.__init__ and B.__init__ get called?
Run Code Online (Sandbox Code Playgroud)
有写作两种典型的方法C的__init__:
ParentClass.__init__(self)super(DerivedClass, self).__init__()但是,在任何一种情况下,如果父类(A和B)不遵循相同的约定,则代码将无法正常工作(某些可能会被遗漏,或被多次调用).
那么又是什么样的正确方法呢?很容易说"只是保持一致,遵循一个或另一个",但如果A或B来自第三方图书馆,那么呢?有没有一种方法可以确保所有父类构造函数被调用(并且以正确的顺序,只有一次)?
编辑:看看我的意思,如果我这样做:
class A(object):
def __init__(self):
print("Entering A")
super(A, self).__init__()
print("Leaving A")
class B(object):
def __init__(self):
print("Entering B")
super(B, self).__init__()
print("Leaving B")
class …Run Code Online (Sandbox Code Playgroud) 我已经到了需要在JavaScript中进行某种基本的多重继承的地步.(我不是来讨论这是否是个好主意,所以请将这些意见保留给自己.)
我只是想知道是否有人尝试过任何(或没有)成功,以及他们如何去做.
简而言之,我真正需要的是能够拥有一个能够从多个原型链继承属性的对象(即每个原型可以拥有自己的正确链),但是在给定的优先顺序中(它将会搜索链以便第一个定义).
为了证明这在理论上是如何可能的,可以通过将辅助链附加到主链的末端来实现,但这会影响任何先前原型的所有实例,而这不是我想要的.
思考?
接口可以在Java中扩展多个接口吗?此代码在我的IDE中显示有效,并且它确实编译:
interface Foo extends Runnable, Set, Comparator<String> { }
Run Code Online (Sandbox Code Playgroud)
但我听说Java中不允许多重继承.为什么接口似乎有例外?