b***i 发帖数: 3043 | 1 一个就是ifstream::read, ofstream::write,
而我们有一个类Block,它的读写很类似,不是char*,而是unsigned char*这样的。
这里有两个问题,第一,如果这两个类都继承一个接口IOable,到好办了,一个基类的
指针可以指向ifstream或者Block,然后read。可惜这两个类没有关系。
第二,类型有些不同。
我现在为每个类都写了一个库,一个从文件读入,一个从Block读入。有什么好办法可
以把库统一成一个吗? | w*********l 发帖数: 1337 | 2 用template写。
如果是c++20的话还可以限定concept,有点儿像Rust的trait.
【在 b***i 的大作中提到】 : 一个就是ifstream::read, ofstream::write, : 而我们有一个类Block,它的读写很类似,不是char*,而是unsigned char*这样的。 : 这里有两个问题,第一,如果这两个类都继承一个接口IOable,到好办了,一个基类的 : 指针可以指向ifstream或者Block,然后read。可惜这两个类没有关系。 : 第二,类型有些不同。 : 我现在为每个类都写了一个库,一个从文件读入,一个从Block读入。有什么好办法可 : 以把库统一成一个吗?
| a******n 发帖数: 100 | 3 可以写 wrapper class (制造 Writer class hierarchy, DataMedium class
hierarchy),然后自己做 dispatch 。
Check Lisp's multi-methods.
Someone implemented for C++ here:
https://github.com/jll63/yomm2
简单的说,就是现在的主流语言C++/Java/Python等等,都在偷懒,只在一个object上
做single dispatch: (所谓的 virtual function):
Animal.makeNoise() {/*abstract*/}
Cat.makeNoise() {print("miao");}
Cow.makeNoise() {print("moo");}
Sheep.makeNoise() {print("mie");}
那么,如果两个动物打架该怎么办?
fight(Animal a, Animal b) {/*abstract*/}
fight(Cat a, Cow b) {a.usePaw(); b.useMuzzle();}
fight(Cat a, Sheep b) {a.usePaw(); b.useHorn();}
fight(Cow a, Sheep b) {a.useMuzzle(); b.useHorn();}
在C++/Java 里有所谓的 visitor design pattern, 来解决这个需要 double
dispatch 在(Animal a 和 Animal b)的问题。
如果动物园有很多种动物,任意3种(甚至N种)一起打架,又怎么办?
所以 Lisp 的 multi-methods 是更 generalized 的解决方案:就是给任意数目的
argument list (而且每一个argument都有自己单独的inheritance hierarchy) 建
multiple dispatch table.
有兴趣的话,可以网上找些资料研究下 | w***g 发帖数: 5958 | | b***i 发帖数: 3043 | 5 好办法
【在 w*********l 的大作中提到】 : 用template写。 : 如果是c++20的话还可以限定concept,有点儿像Rust的trait.
|
|