2015-07-13 4 views
2

Я хочу иметь суперкласс, который будет наследоваться подклассами.Как закодировать поле суперкласса, которое принимает несколько подклассов?

Предположим, я хочу, чтобы суперкласс mother был унаследован child.a и child.b.

Так что я сделать эти классы

мать:

class mother(osv.osv): 

    _name   = "mother" 

mother() 

child.a:

class child_a(osv.osv): 

    _name   = "child.a" 
    _inherit  = "mother" 

child_a() 

child.b:

class child_b(osv.osv): 

    _name   = "child.b" 
    _inherit  = "mother" 

child_b() 

теперь давайте говорить, что я есть класс a tha т имеют many2one подключение к mother

class a(osv.osv): 

    _name   = "a" 
    _columns  = { 
     'mother' : fields.many2one('mother', 'Mother'), 
    } 

a() 

ли принимать mother поле как класс child.a и child.b. Если да, то как закодировать методы создания и записи. Если нет, то каким образом я могу достичь этого иначе? (поле, принимающее несколько подклассов)

ответ

2

Нет, a many2one Ссылка mother не может адресовать записи class.a или class.b.

Метод наследования, используемый для class.a и class.b, фактически копирует функции mother. Они создают две новые независимые таблицы, копии mother, содержащие независимые наборы данных.

Это означает, что классы не являются взаимозаменяемыми. Записи в child.a нет в mother и наоборот.

что вы описываете может быть достигнуто с delegation inheritance - вы можете думать, что, как class.x имеющий mother класс «встроенный» в нем, через специальный many2one отношения.

Таким образом, когда вы создаете новую запись class.x, также создается неявно созданная запись mother.

Но это работает в одном направлении: создание новой записи mother не создает запись class.x.

example of delegation inheritance в основных модулях: res.users: Пользователь «внедряет» Партнера. Когда создается новый пользователь, для него также создается новый Партнер.

Many2one отношения с партнерами также смогут ссылаться на Пользовательские партнеры. Но many2one отношения к Пользователям не смогут ссылаться на Партнеров, которые не являются Пользователями.

+0

Из примера два 'many2one' поля добавляются в' mother', но не накладывают на создание создание 'mother' для каждого времени создания ребенка? Разве не разумнее добавить вместо этого обязательное поле «many2one mother» для ребенка? Я до сих пор не понимаю эту концепцию. – William

+0

Хитрость заключается в том, чтобы не думать об этом как о фактическом «наследовании объекта», просто подумайте о «копировании модели».Честно говоря, этот метод наследования полезен только для расширения класса. Чтобы создать производный класс, вы должны действительно использовать наследование делегирования. –

+0

Но оба производных класса (child_a, child_b) не будут вписываться в одно поле 'many2one mother 'в модели' a', не так ли? – William

 Смежные вопросы

  • Нет связанных вопросов^_^