具有接口类的多重继承是一种很好的设计实践吗?
它似乎工作,使运行gtest unittest套件方便.那么在下面的例子中,B类的多重继承是一个糟糕的设计实践吗?
#include <stdio.h>
class BInterface {
public:
virtual ~BInterface() {}
virtual void idb() = 0;
};
class A {
public:
A() {}
void ida() {printf("I am A\n");}
};
class B : public A, public BInterface { // ########### Is this OK? ############
public:
B() {}
void idb() {printf("I am B\n");}
};
int main() {
B BObject;
BInterface* BI = &BObject;
BI->idb();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑:我只是继承接口类,但在这种情况下是多重继承是一种糟糕的设计,考虑到大多数代码专家建议不要使用多重继承.
我知道在这个网站上可能会多次询问这个问题.我已经阅读了其他帖子并阅读了一些关于我们为什么必须使用接口的书籍.所有这些帖子和书籍都说,接口就像类,但它们只能包含函数,所有实现它们的类也应该实现它们的方法.所以我基本上知道它们是什么但是我不明白我为什么要编写一个接口,当我可以创建一个超类并将我的其他类扩展到那个超类而不是一次又一次地重写继承的函数.
如果有人向我解释,我真的很感激.
可能重复:
最好在java中使用接口
嗨,
在定义类时,我应该总是定义一个相应的接口吗?
有什么好处
List list = new ArrayList();
Run Code Online (Sandbox Code Playgroud)
为什么不呢 -
ArrayList arrayList = new ArrayList();
Run Code Online (Sandbox Code Playgroud)
谢谢
我正在重构我的代码,所以我需要做出关于接口或抽象类的决定.我有基类Player和继承基类的类,它们被称为VideoPlayer,MusicPlayer等.基类有抽象方法,没有实现(Play).那么,什么是更好的方式?将Play置于界面中或将其保留为抽象类.在MusicPlayer中播放与VideoPlayer中的播放器不同.我在C#中这样做.
class Player
{
abstract void Play();
}
class VideoPlayer : Player
{
void Play()
{
//Some code.
}
}
class MusicPlayer : Player
{
void Play()
{
//Some code.
}
}
Run Code Online (Sandbox Code Playgroud) 我试过了:
ArrayList<Pelicula> peliculas = YIFY.obtenerPeliculasPorVenir();
Run Code Online (Sandbox Code Playgroud)
是#obtenerPeliculasPorVenir:
public static List<Pelicula> obtenerPeliculasPorVenir(){
List peliculas = null;
try {
peliculas = mapper.readValue(new API().peticionTexto("http://yts.re/api/upcoming.json"), new TypeReference<List<Pelicula>>(){});
}
catch (IOException excepcion) {
System.out.println(excepcion.getMessage());
}
return peliculas;
}
}
Run Code Online (Sandbox Code Playgroud)
如果ArrayList 实现 List为什么我不能这样做?
是铸造唯一的解决方案还是我应该采取另一种OOP方法?
可能是最着名的软件开发人员面试问题之一.
你的答案是什么?
编辑:我想知道如何在现实生活中回答这个问题.请尝试像在实际面试时一样制定答案(完整,但不要太长,当然不发布任何链接).
根据OOP,需要抽象类来模拟那些在现实世界中不存在的对象,但它们可以作为几个真实世界对象的基类.
例如:
BankAccount
/\
/ \
/ \
/ \
Current Savings
Account Account
Run Code Online (Sandbox Code Playgroud)
这里BankAccount应该被建模为抽象类.
但是在C#/ Java中使用抽象类的技术原因是什么?链接文字
例如:
使用Interfaces的OOP原因是对行为继承进行建模(继承没有真正的层次关系).
在C#/ Java中使用Interfaces的技术原因是为了解决多重继承的问题(如果我没有错!).