我在以多态方式将记录加载到数据库时遇到问题。
我有:
- 由不同类型的记录 ( , )
Record
扩展的 ' ' 对象RecordA
RecordB
- 一种
load_record()
不知道它正在加载什么类型的记录的方法 - 一个数据库接口,需要包含数据库的所有信息
据我了解,多态我可以这样做:
class RecordA(Record):
def load_into_db(self, db_impl):
db_impl.load_record_a(self)
class DbImpl(DbInt):
def load_record_a(self, record):
...
def load_record_b(self, record):
...
def load_record(record):
record.load_into_db(db_impl)
或者
class RecordA(Record):
def get_record_data(self):
....
def get_db_proc(self, db_impl):
return db_impl.get_record_a_proc()
class DbImpl(DbInt):
def get_record_a_proc(self):
...
def load_record(record):
record_data = record.get_data()
db_proc = record.get_db_proc(db_impl)
db_impl.load_record(record_data, db_proc)
这两个似乎有点笨拙。或者,我们可以有效地使用 switch 语句:
class DbImpl(DbInt):
procs = { RecordA: ..., RecordB: ...}
...
def load_record(record):
data = record.get_data()
db_proc = procs[type(record)]
db_impl.load_record(record_data, db_proc)
现在可能很明显,问题是数据库需要使用一个特定的存储过程(它在它自己的代码中),但是如果不询问记录本身,它就不知道要使用哪个存储过程。
示例 1 对我来说看起来是最多态的,但是DbImpl
每当我们添加新类型的记录时它仍然需要编辑代码,那么它是否比示例 3 更好?如果是这样,为什么?
干杯,威尔