分类:
2008-04-23 14:16:27
class File {
public:
virtual void Open() = 0;
virtual void Save() = 0;
virtual void SaveAs(String&) = 0;
virtual void Close() = 0;
};
class TextFile : public File {
public:
void Open();
void Save();
void SaveAs(String&);
void Close();
};
class ImageFile : public File {
public:
void Close();
void Save();
void SaveAs(String&);
void Close();
};
// 通过菜单项打开文件
void menu_open_file(File* f_ptr) {
f_ptr->Open();
....
....
}
我们可以如下运用上述代码:
File *file_ptr = new TextFile();
menu_open_file(file_ptr);// 打开文本文件
....
....
file_ptr = new ImageFile();
menu_open_file(file_ptr); // 打开图片文件
总结:
A. 在上面这个实例中,File就是我们识别的抽象概念。我们将其定义为一个抽象基类。
B. Open, Save, SaveAs, Close是共有方法,并在File类中被声明为虚函数
C. File抽象概念的具体实现是image file和text file。我们为其提供了具体的实现。
D. Open, Save, SaveAs, Close等菜单操作将会调用这里的具体实现
E. 如果用户选择了打开文件菜单项,该菜单项的实现函数将会根据所需打开文件的不同类型调用不同的实现。
使用模板来实现多态
使用模板的话,你不用在基类中声明共有的方法。但是,你需要在程序中隐式声明它们。
使用模板来实现上面的实例:
class TextFile {
void Open();
};
class ImageFile {
void Open();
};
// 使用菜单项来打开文件
template<typename T> void menu_open_file(T file) {
file.open();
}
TextFile txt_file;
ImageFile img_file;
menu_open_file(txt_file); // 打开文本文件
menu_open_file(img_file);
// 打开图片文件
class container {
virtual void add();
virtual void remove();
virtual void print();
};
class list : container {
....
};
class vector : container {
....
};
void Sort(container& con) {
....
}
void Search(container& con) {
....
}
class File {
public:
virtual void Open() = 0;
virtual void Save() = 0;
virtual void SaveAs(String& file_name) = 0;
};
class TextFile : public File {
public:
void Open();
void Save();
void SaveAs(String& file_name);
};
class ImageFile : public File {
public:
void Open();
void Save();
void SaveAs(String& file_name);
};
class BinaryFile: public File {
public:
void Open();
void Save();
void SaveAs(String& file_name);
};
class TextFile {
public:
void Open();
void Save();
void SaveAs(String& file_name);
void Print();
};
class ImageFile {
public:
void Open();
void Save();
void SaveAs(String& file_name);
void Print();
};
class BinaryFile {
public:
void Open();
void Save();
void SaveAs(String& file_name);
// 这里没有提供Print函数
};
template <typename T>
void On_Open( T file) {
file.Open();
}
template <typename T>
void On_Save( T file) {
file.Save();
}
template <typename T>
void On_Print( T file) {
file.Print();
}
TextFile txt_file;
ImageFile img_file;
BinaryFile bin_file;
On_Print(txt_file);
On_Print(img_file);
On_Print(bin_file); // 这里编译时将会出错