派生类具有不同的接口

时间:2018-02-01 05:53:57

标签: python inheritance adapter

以下代码:

class Cache:

    def __init__(self):
        self._cache = []

    def store(self, data):
        self._cache.append(data)

    def stats(self):
        print('We are caching {} elements'.format(len(self._cache)))


class LegoCache(Cache):

    def store(self, weight, color):
        Cache.store(self, (weight, color))

有一个问题,即store方法没有实现基类的接口。

如何改进此代码?我有以下想法:

  • 不要从Cache派生,只需使用它。
  • 将基类中的store方法重命名为store_base

还有其他选择吗?

修改

基类还必须支持这个其他用例:

class ZombieCache(Cache):

    def store(self, dead_since, humans_eaten, can_be_saved=False):
        Cache.store(self, dict(
            dead_since=dead_since, 
            humans_eaten=humans_eaten, 
            can_be_saved=can_be_saved))

2 个答案:

答案 0 :(得分:2)

您可以在基类中使用变量参数列表:

var fragmentproxy = viewer.impl.getFragmentProxy(viewer.model, fragIds);

console.log(fragmentproxy);

因此不需要重载此方法或为特殊情况添加具有不同名称的方法:

class Cache:

    def __init__(self):
        self._cache = []

    def store(self, *args):
        self._cache.append(args)

    def stats(self):
        print('We are caching {} elements'.format(len(self._cache)))

class LegoCache(Cache):
    pass
    # "overloading" store isn't needed

另一种解决方案可能是授权:

cache = Cache()
legoCache = LegoCache()

cache.store(x)
legoCache.store(x, y)

答案 1 :(得分:0)

我会像这样实现它,

class Cache:

  def __init__(self):
      self._cache = []

  def store(self, data):
      self._cache.append(data)

  def stats(self): 
      print('We are caching {} elements'.format(len(self._cache)))


class LegoData(object):

  def __init__(self, weight, color):
      self.weight = weight
      self.color = color

class LegoCache(Cache):
   pass

客户端将像这样访问它,

lego_cache = LegoCache()
lego_cache.store(LegoData(weight=10, color='Green'))