我想从几个旧的测试类中使用一些方法到我正在构建的新类中.不幸的是,C#不支持多重继承.如何重用这些旧类中的代码?我只是将它们创建为成员对象吗?或者我还有其他选择吗?
我正在使用Java中的某个API库.它有一个基类A,以及B和C,它们都扩展了A. B&C提供了类似但不同的功能,所有三个类都在库中.
public abstract class A
{
virtual foo();
}
public class B extends A {}
public class C extends A {}
Run Code Online (Sandbox Code Playgroud)
我如何获得的元素A,B以及C在我的课?如果我使用的接口来实现的类,有很多重复的代码,内部类不会允许,这样的调用接口,我重写现有的方法A,B以及C将被保留.
如何在Java中实现多重继承?
编辑:感谢编辑George,现在更清楚了,忘了提一个关键要求:我的类必须以A为基础,以便它们可以通过平台API进行管理.
可能重复:
Objective-C多重继承
在我的应用程序,我需要添加SideSwipeTableViewController和PullRefreshTableViewController到ViewController.h.但是,出于某种原因,当我尝试构建应用程序时,它会给我一个错误.
这是代码:
@interface ViewController : SideSwipeTableViewController, PullRefreshTableViewController {
...
}
Run Code Online (Sandbox Code Playgroud)
它可以在任何一个进入,但不是两个都有效.我想知道的是:有没有办法成功实现这两个类?在此先感谢,我对这个问题道歉:我对Objective-C还有点新意.
如果我继承了具有相同名称但来自不同基类的不同签名的函数,则尝试调用该函数会生成错误,声称该调用不明确.单个基类中的相同函数不会生成错误.为什么是这样?
第一个案例,http://ideone.com/calH4Q
#include <iostream>
using namespace std;
struct Base1
{
void Foo(double param)
{
cout << "Base1::Foo(double)" << endl;
}
};
struct Base2
{
void Foo(int param)
{
cout << "Base2::Foo(int)" << endl;
}
};
struct Derived : public Base1, public Base2
{
};
int main(int argc, char **argv)
{
Derived d;
d.Foo(1.2);
return 1;
}
prog.cpp: In function ‘int main(int, char**)’:
prog.cpp:27:7: error: request for member ‘Foo’ is ambiguous
prog.cpp:14:10: error: candidates are: void Base2::Foo(int)
prog.cpp:6:10: error: void …Run Code Online (Sandbox Code Playgroud) 我使用下面的3层继承设计:
class connect_info {
// these members
};
class vertex : public connect_info {
// ...
};
// user-defined struct
class algo_vertex: public vertex {
// ...
};
Run Code Online (Sandbox Code Playgroud)
connect_info类的成员(我these members在这个问题中称它)仅在vertex课堂上使用.但为了保持vertex类的语义清晰,我必须分开these members到另一个基类(connect_info).
这里产生的问题:
protected并且private现在都没用.如果没有connect_info基类,private可以正常工作)考虑
trait Foo[+A, +B]
trait Foo1[+A] extends Foo[A, Nothing]
trait Foo2[+B] extends Foo[Nothing, B]
Run Code Online (Sandbox Code Playgroud)
new Foo1[String] with Foo2[Nothing] 作品.
new Foo1[Nothing] with Foo2[String] 作品.
new Foo1[String] with Foo2[String] 不会:
error: illegal inheritance;
<$anon: Foo1[String] with Foo2[String]> inherits different type instances of trait Foo:
Foo[Nothing,String] and Foo[String,Nothing]
new Foo1[String] with Foo2[String]
^
Run Code Online (Sandbox Code Playgroud)
似乎在第一种情况下,实例是一个子类型Foo[String, Nothing].
同样,似乎在第二种情况下,实例应该是子类型Foo[String, String].
这两个之间有什么区别只会导致一个编译?
如果我有一个继承自一个接口的类(下面)和 wxPane
class iClassA
{
public:
virtual ~iClassA() {}
virtual bool FuncA() = 0;
};
Run Code Online (Sandbox Code Playgroud)
沈志南:
class ConcereteClass : public iClassA, wxPane
{
public:
bool FuncA();
};
Run Code Online (Sandbox Code Playgroud)
有一个包含我std::vector的类型是否可以接受或者在铸造时会感到困惑?iClassA *ConcereteClassvmaps
问题是,对具有多重继承的类的第二个超类的nullptr的隐式转换(至少在LLVM 7.0.2中)在调整中应用于nullptr.指针现在不再为null(如果在超类的方法中执行空检查)可能导致崩溃(我猜技术上是未定义的行为).
这是一个最小的例子:
#include <iostream>
inline bool pointerIsNotNull(const void* ptr) { return ptr != nullptr; }
class IntValue {
public:
IntValue() { }
int getIntValue() { return pointerIsNotNull(this) ? value : 0; }
private:
int value;
};
static const char* nullptrChar = "nullptr";
class CharValue {
public:
CharValue() { }
const char* getCharValue() { return pointerIsNotNull(this) ? value : nullptrChar; }
private:
char* value;
};
class Foo : public IntValue, public CharValue {
public:
Foo() { }
double getDoubleValue() { …Run Code Online (Sandbox Code Playgroud) 如果您有多个继承层并且知道存在特定变量,是否有办法追溯到变量的起源位置?无需通过查看每个文件和类来向后导航.可能会调用某种功能吗?例:
parent.py
class parent(object):
def __init__(self):
findMe = "Here I am!"
Run Code Online (Sandbox Code Playgroud)
child.py
from parent import parent
class child(parent):
pass
Run Code Online (Sandbox Code Playgroud)
grandson.py
from child import child
class grandson(child):
def printVar(self):
print self.findMe
Run Code Online (Sandbox Code Playgroud)
尝试通过函数调用找到findMe变量的来源.
我正在开发一个涉及PyQt5的项目,我正在努力管理小部件之间的继承.
我有一个QWidget屏幕继承了QtWidgets.QWidget和另一个由QtDesigner生成的类.它读起来像这样:
class a(QtWidgets.QWidget, Ui_a):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.setupUi(self)
<some attributes>
<some functions
Run Code Online (Sandbox Code Playgroud)
在这里,我继承了Ui_a一个存储在生成文件中的单独类,我可以调用setupUi(一种方法Ui_a).
我现在想要创建另一个类b,它也是一个需要显示的QWidget.该类b需要使用类中的一些函数和属性a.我可以轻松地复制粘贴所需的东西,但这是不好的做法,所以我正在寻找一个更整洁的解决方案.如果我做代码:
class b(QtWidgets.QWidget, Ui_b, a):
def __init__(self, parent=None):
QtWidgets.QWidget.__init(self, parent)
self.setupUi(self)
Run Code Online (Sandbox Code Playgroud)
然后崩溃并显示一条错误消息,指出它无法创建一致的方法解析顺序.
我的第一个问题是 - 我知道我需要调用类的init方法,a因为a那里创建了属性,但我不知道如何.
我的第二个问题是 - 如何修复此MRO错误并成功创建b可以使用其a属性和函数的新类?
c++ ×4
class ×4
inheritance ×3
oop ×2
python ×2
ambiguous ×1
c# ×1
covariance ×1
generics ×1
interface ×1
java ×1
nullptr ×1
objective-c ×1
pyqt ×1
reusability ×1
scala ×1
traits ×1
variables ×1
xcode ×1