假设您有以下情况
#include <iostream>
class Animal {
public:
virtual void speak() = 0;
};
class Dog : public Animal {
void speak() { std::cout << "woff!" <<std::endl; }
};
class Cat : public Animal {
void speak() { std::cout << "meow!" <<std::endl; }
};
void makeSpeak(Animal &a) {
a.speak();
}
int main() {
Dog d;
Cat c;
makeSpeak(d);
makeSpeak(c);
}
Run Code Online (Sandbox Code Playgroud)
如您所见,makeSpeak是一个接受通用Animal对象的例程.在这种情况下,Animal非常类似于Java接口,因为它只包含一个纯虚方法.makeSpeak不知道它传递的Animal的性质.它只是发送信号"speak"并留下后期绑定来处理调用哪种方法:Cat :: speak()或Dog :: speak().这意味着,就makeSpeak而言,实际传递哪个子类的知识是无关紧要的.
但是Python呢?让我们看看Python中相同案例的代码.请注意,我尝试尽可能与C++案例尽可能相似:
class Animal(object):
def speak(self):
raise NotImplementedError()
class Dog(Animal):
def speak(self):
print "woff!"
class Cat(Animal):
def …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我(如在许多其他应用程序中)一个被称为Contact任何人的实体.在最基本的层面上,这用于表示业务联系人.但是,它也可以用来代表公司的员工.并且还有一些特殊类型的员工(比方说有一个叫Manager)
我试图将其建模为一种有意义的继承关系.员工的姓名和地址就像联系人一样,以及一些与就业相关的属性.经理还拥有许多经理特定的属性.
当员工晋升为经理时,困难就出现了.可以将基类Employee转换为继承类Manager吗?感觉不对.我想我会用一个专门的构造函数来做Manager.
顺便说一句,NHibernate是否支持这种行为?是获得员工,从员工创建经理,然后保存经理这么简单吗?
我对OOP的理解非常有限.
我已经在.Net中编程了一年左右,但我完全是自学成才,所以我对OOP细节的一些使用感到失望.
封装,继承,抽象等我知道它们的含义(表面上看),但它们的用途是什么?
我只使用OOP将可重用代码放入方法中,但我知道我错过了很多功能.
甚至班级 - 我只做了两到三次实际班级.相反,我通常只使用MainForm包含所有方法.