p*********r 发帖数: 40 | 1 假设有个base class叫Animal
derived class包括Cat,Dog等等
class Cat: public Animal {
...
};
现在希望在Animal里定义一个成员函数,比如叫processData
其作用是处理一些各种动物共通的数据,比如身高体重之类的
其输入是AnimalData这个class的object,当然身高体重什么的都是AnimalData这个
class的member variable
而在Cat这个class里,希望有一个overriden的processData函数,处理身高体重加上其
他一些cat特有的数据,比如胡须长度,这些数据都是CatData这个class的member
variable,当然,CatData是AnimalData的 derived class
现在问题是一般怎么设计这个base class Animal和derived class Cat?
假如把processData的输入参数设为AnimalData类型的reference,那么Cat的
processData就不能用CatData类型的referenc... 阅读全帖 |
|
B********e 发帖数: 1062 | 2 class Animal {
virtual void processData(AnimalData &d) {
{
//process common data for an animal
processPrivateData(d);
}
protected:
virtual void processPrivateData(AnimalData &d) = 0;
};
class Cat : public Animal {
virtual void processPrivateData(AnimalData &d)
{
//process cat specific data
}
};
class Dog : public Animal {
virtual void processPrivateData(AnimalData &d)
{
//process dog specific data
}
}; |
|
B********e 发帖数: 1062 | 3 Try this:
class Animal {
virtual void processData(AnimalData &d)
{
//process common data for an animal
}
};
class Cat : public Animal {
virtual void processData(AnimalData &d)
{
Animal::processData(d);
//process cat specific data
}
};
class Dog : public Animal {
virtual void processData(AnimalData &d)
{
Animal::processData(d);
//process dog specific data
}
}; |
|
k***e 发帖数: 1931 | 4 也许理解的不对。CatData从AnimalData继承,那么CatData is a AnimalData,
processData使用(AnimalData*)作为参数,在Cat类中用RTTI判断指针指向的对象是
不是一个CatData不就行了吗? |
|
G**U 发帖数: 180 | 5 是我没弄懂lz问题还是。。。我这个实现有什么问题吗?
1 #include
2
3 using namespace std;
4
5 class AnimalData {
6 public:
7 int a;
8 };
9
10 class CatData : public AnimalData {
11 public:
12 int b;
13 };
14
15 class Animal {
16 public:
17 virtual void processData(AnimalData &d)
18 {
19 cout << d.a << endl;
20 }
21 };
22
23 class Cat : public Animal {
24 public:
25 virtual void processData(CatData &d)
26 {
27 Animal::processData(d);... 阅读全帖 |
|
K*******g 发帖数: 26 | 6 如果Animal, Cat, AnimalData, CatData这样结构定死了确实很难办,但一般很难办的
时候都说明结构本身有问题。在我看来CatData继承AnimalData不是很合适,因为从命
名上说这两个都只是一组数据,没有成员函数的话享受不到继承带来的多态性。
如果可以的话建议改成以下类:
AnimalBasicData:所有动物都有的数据
AnimalXSpecificData:X特有数据
AnimalData {
enum AnimalType{...}
AnimalType type;
AnimalBasicData *basic;
AnimalXSpecificData *xdata;
AnimalYSpecificData *ydata;
...
}
仅供参考:) |
|
|
B********e 发帖数: 1062 | 8 it does not make sense to keep two parallel set of classes
amimal,cat,dog
with
animaldata,catdata,dogdata
my idea is to make the data in a general format. for example in json format.
using the key to find the specific fields to process.
cover
Cat |
|
N******K 发帖数: 10202 | 9 怎么设计这个基于Json格式的 AnimalData?
这个想法挺好 能仔细展开讲讲么?
format. |
|
B********e 发帖数: 1062 | 10 animaldata is just a map of key-val pairs.
say there is a field ‘type’.
in cat.processdata
if type is cat
do cat data.
else
print error
return. |
|
Q**g 发帖数: 183 | 11 像是经典的Double dispatch pattern.
你大概是想 Dog process DogData, Cat process CatData; 当 Dog 遇上 CatData 或者
Cat 遇上 DogData 就用缺省的 Animal process AnimalData。试试
#include
class Animal;
class Data;
class Cat;
class CatData;
class Dog;
class DogData;
using namespace std;
class Data {
public:
virtual void process(const Animal* animal) const {
cout << "Default Data and Animal" << endl;
}
virtual void process(const Cat* animal) const {
process((const Animal*) animal);
}
... 阅读全帖 |
|