我何时应该使用接口,何时应该使用基类?
如果我不想实际定义方法的基本实现,它应该始终是一个接口吗?
如果我有狗和猫类.为什么我要实现IPet而不是PetBase?我可以理解有ISheds或IBarks(IMakesNoise?)的接口,因为那些可以基于宠物放在宠物上,但我不明白哪个用于通用Pet.
所以,我变得臭名昭着
未定义的引用'vtable ...
以下代码的错误(有问题的类是CGameModule.)我不能为我的生活理解问题所在.起初,我认为这与忘记给虚拟功能一个身体有关,但据我所知,一切都在这里.继承链有点长,但这里是相关的源代码.我不确定我应该提供哪些其他信息.
注意:构造函数是发生此错误的地方,看起来如此.
我的代码:
class CGameModule : public CDasherModule {
public:
CGameModule(Dasher::CEventHandler *pEventHandler, CSettingsStore *pSettingsStore, CDasherInterfaceBase *pInterface, ModuleID_t iID, const char *szName)
: CDasherModule(pEventHandler, pSettingsStore, iID, 0, szName)
{
g_pLogger->Log("Inside game module constructor");
m_pInterface = pInterface;
}
virtual ~CGameModule() {};
std::string GetTypedTarget();
std::string GetUntypedTarget();
bool DecorateView(CDasherView *pView) {
//g_pLogger->Log("Decorating the view");
return false;
}
void SetDasherModel(CDasherModel *pModel) { m_pModel = pModel; }
virtual void HandleEvent(Dasher::CEvent *pEvent);
private:
CDasherNode *pLastTypedNode;
CDasherNode *pNextTargetNode;
std::string m_sTargetString;
size_t m_stCurrentStringPos;
CDasherModel *m_pModel;
CDasherInterfaceBase …Run Code Online (Sandbox Code Playgroud) 据我所知:
C++提供了三种不同类型的多态性.
除了上述三种类型的多态性外,还存在其他种类的多态性:
我知道运行时多态性可以通过虚函数实现 ,静态多态可以通过模板函数实现
但对于另外两个
ad-hoc多态性:
如果可以使用的实际类型的范围是有限的,并且必须在使用之前单独指定组合,则这称为ad-hoc多态.
参数多态性:
如果所有代码都是在没有提及任何特定类型的情况下编写的,因此可以透明地使用任意数量的新类型,这称为参数多态.
我几乎无法理解他们:(
任何人都可以用一个例子解释他们两个吗?我希望这些问题的答案对他们大学的许多新的消息有所帮助.
请帮助我们解决"几乎"的争议一切都是一个对象(Stack Overflow问题的答案作为一个新手,在学习C#之前有什么我应该注意的吗?).我认为就是这种情况,因为Visual Studio中的所有内容至少都显示为结构体.请张贴参考文献,以免它变成"现代傻瓜"(This American Life).
请注意,这个问题涉及C#,不一定是.NET,以及它如何处理引擎盖下的数据(显然它都是1和0).
以下是"一切都是对象"的评论:
对象的定义:"对象"作为类System.Object的继承者与"对象"作为类型与"对象"作为引用类型的实例."
这个网站让我感到幽默感 - http://www.antiifcampaign.com/但是在你使用if语句的每种情况下,多态性都可以工作吗?
我正在阅读Head First面向对象设计,以便更好地理解OOP概念.
多态性解释为:
Airplane plane = new Airplane();
Airplane plane = new Jet();
Airplane plane = new Rocket();
Run Code Online (Sandbox Code Playgroud)
您可以编写适用于超类的代码,如飞机,但可以使用任何子类.: - 嗯...... 我得到了这个.*.
它进一步解释说:
- > 那么多态如何使代码变得灵活?
好吧,如果你需要新的功能,你可以写一个新的AirPlane子类.但是,由于您的代码使用了超类,因此您的新类将在不对代码的其余部分进行任何更改的情况下工作.
现在我没有得到它.我需要创建一个飞机的子类.例如:我创建一个类,Randomflyer.要使用它,我将不得不创建它的对象.所以我会用:
Airplane plane = new Randomflyer();
Run Code Online (Sandbox Code Playgroud)
我没有得到它.即使我会直接创建子类的对象.当我添加新的子类时,我仍然不需要在任何地方更改我的代码.使用超类如何使我免于对其余代码进行额外更改?
我有一些话题需要讨论.我有一个24 ifs/elifs 的代码片段.Operation是我自己的类,表示类似的功能Enum.
这是一段代码:
if operation == Operation.START:
strategy = strategy_objects.StartObject()
elif operation == Operation.STOP:
strategy = strategy_objects.StopObject()
elif operation == Operation.STATUS:
strategy = strategy_objects.StatusObject()
(...)
Run Code Online (Sandbox Code Playgroud)
从可读性的角度来看,我有一些顾虑.更好的是将它改成24个类并使用多态?我不相信它会使我的代码可维护......从一方面来说,这些代码if非常清晰,并且不应该难以理解,另一方面,有太多if的代码.
我的问题相当普遍,但是我用Python编写代码所以我不能使用像switch.
你怎么看?
更新:
一个重要的是StartObject(),StopObject()并且StatusObject()是构造函数,我想分配一个对象来strategy引用.
python conditional if-statement code-readability code-maintainability
我一直在收到关于Delphi编译器的警告 Method 'Create' hides virtual method of base.
我已经回顾了几个Stack Overflow链接(见下文),我不明白这个警告背后的逻辑,以及为什么它被认为是错误的编码实践.我希望别人能帮助我理解
我将包含一些示例代码:
type
TMachine = class(TPersistent)
private
public
Horsepower : integer;
procedure Assign(Source : TMachine);
end;
...
procedure TMachine.Assign(Source : TMachine);
begin
inherited Assign(Source);
Self.Horsepower := Source.HorsePower;
end;
Run Code Online (Sandbox Code Playgroud)
这会导致编译器警告.
[dcc32 Warning] Unit1.pas(21): W1010 Method 'Assign' hides virtual method of base type 'TPersistent'
Run Code Online (Sandbox Code Playgroud)
我一直忽视这个警告,因为它对我没有任何意义.但这让我以另一种方式遇到了麻烦(请参阅我在这里的另一篇文章:为什么Delphi在动态对象创建过程中会调用错误的构造函数?)所以我决定尝试更好地理解这一点.
我知道如果我使用保留字reintroduce,错误就会消失,但我已经看到它反复发布这是一个坏主意.正如Warren P在这里所写的那样(德尔福:方法'创造'隐藏基础的虚拟方法 - 但它就在那里),"恕我直言,如果你需要重新引入,你的代码闻起来很可怕".
我想我理解"隐藏"是什么意思.正如David Heffernan在这里所说的那样(导致"W1010方法'%s'隐藏基类型'%s'的虚拟方法"的原因是什么?):
隐藏的含义是,从派生类中,您不再能够访问基类中声明的虚方法.您不能引用它,因为它与派生类中声明的方法具有相同的名称.后一种方法是从派生类中可见的方法.
但我有点困惑,因为似乎祖先方法并没有真正隐藏,因为派生类总是只能使用inherited关键字来调用基类中的方法.所以'隐藏'真的意味着'有些隐藏'吗?
我想我也明白使用保留字override会阻止编译器警告,但程序签名必须相同(即没有新添加的参数).我不能在这里使用它.
我不明白为什么隐藏是值得警告的.在我上面的代码示例中,我不希望用户TMachine.Assign()以某种方式使用TPersistent.Assign().在我的扩展课程中,我扩展了需求,因此希望他们使用新的和改进的功能.因此,隐藏旧代码似乎正是我想要的.我对 …
oop ×5
polymorphism ×4
c++ ×2
object ×2
base-class ×1
c# ×1
c++-faq ×1
conditional ×1
coupling ×1
delphi ×1
g++ ×1
gcc ×1
if-statement ×1
inheritance ×1
interface ×1
overloading ×1
python ×1
terminology ×1