2013-07-31 3 views
2

Я слышал, как много людей говорят о Go и как оно не поддерживает наследование. Пока я не использовал этот язык, я просто согласился с толпой и слушал, как говорят. После небольшого разговора с языком, справляясь с основами. Я наткнулся на этот сценарий:Есть ли поддержка наследования?

package main 

type Thing struct { 
    Name string 
    Age int 
} 

type UglyPerson struct { 
    Person 
    WonkyTeeth bool 
} 

type Person struct { 
    Thing 
} 

type Cat struct { 
    Thing 
} 


func (this *Cat) SetAge(age int){ 
    this.Thing.SetAge(age) 
} 

func (this *Cat GetAge(){ 
    return this.Thing.GetAge() * 7 
} 

func (this *UglyPerson) GetWonkyTeeth() bool { 
    return this.WonkyTeeth 
} 

func (this *UglyPerson) SetWonkyTeeth(wonkyTeeth bool) { 
    this.WonkyTeeth = wonkyTeeth 
} 

func (this *Thing) GetAge() int { 
    return this.Age 
} 

func (this *Thing) GetName() string { 
    return this.Name 
} 

func (this *Thing) SetAge(age int) { 
    this.Age = age 
} 

func (this *Thing) SetName(name string) { 
    this.Name = name 
} 

теперь, что это делает его сочиняет Человек и Кошка структур, от Thing Struct. Поступая таким образом, структура Person и Cat не только разделяет те же поля, что и Thing Struct, но также и посредством композиции методы Thing также разделяются. Разве это не наследование? Кроме того, по implenting интерфейса как таковые:

type thing interface { 
    GetName() string 
    SetName(name string) 
    SetAge(age int) 
} 

Все три Структур теперь присоединились или я должен сказать, может быть использован в однородной моде, такие как массив «вещи».

Итак, я лежал на вас, это не наследование?

Редактировать

Добавлен новый производный STRUCT под названием «Гадкий человек» и ПЕРЕОПРЕДЕЛЕНЫ метод SetAge для Ката.

+0

Нет, **, как вы сказали, ** это ** не наследование ** но ** Состав **. Быть педантичным ... что ты скажешь? У человека есть вещь? Вы не можете передать вещь вместо человека. О интерфейсах хорошо да, это ** как-то ** наследование, но вы не можете наследовать реализованные поведения, просто их определение. Представьте, что человек МОЖЕТ СДЕЛАТЬ что-то (но каждый исполнитель должен сделать это по-своему). –

+1

Но синтаксический сахар, заставляет его чувствовать себя наследованием, разве это не все, что действительно есть наследование при использовании языка OO? – WeNeedAnswers

+0

Я бы сказал, что это черты характера. – WeNeedAnswers

ответ

4

Это наследование, но, вероятно, не такое наследование, которое вы, вероятно, после. Ваш пример выглядит многообещающим b/c Person и Cat поведенчески и структурно равны друг другу по модулю имен типов.

Как только вы попытаетесь использовать это «наследование» для расширения какого-либо базового типа, например, добавленных полей, вы обнаружите, что получатель «базового класса» всегда является базовым классом, никогда не расширенный. IOW, вы не можете достичь иерархии структурно полиморфного типа.

OTOH, Go поддерживает чисто поведенческое наследование через интерфейсы. Вставка одного интерфейса в другой делает создать дерево наследования.

package main 

import "fmt" 

type Thing struct { 
    Name string 
    Age int 
} 

func (t *Thing) me() { 
    fmt.Printf("I am a %T.\n", t) 
} 

type Person struct { 
    Thing 
} 

func (p *Person) Iam() { 
    fmt.Printf("I am a %T.\n", p) 
} 

type Cat struct { 
    Thing 
} 

func (c *Cat) Iam() { 
    fmt.Printf("I am a %T.\n", c) 
} 

func main() { 
    var p Person 
    var c Cat 

    p.me() 
    p.Iam() 

    c.me() 
    c.Iam() 
} 
+0

Можете ли вы привести пример того, что говорят, пожалуйста, используя тупой код, который у меня выше? Просто так, чтобы я полностью понял. Я не знаю, добавьте ShoeSize :) – WeNeedAnswers

+0

+1 правильно, но, глядя на оригинальный вопрос, я бы не стал бить, что ОП понял, что вы имеете в виду ... –

+0

Я добавил человека, добавив новый Struct под названием UglyPerson и давая ему wonkyTeeth , Я пока не вижу проблемы? – WeNeedAnswers

2

Это называется композиция. Методы Person или Cat не имеют прямого доступа к полям Thing. Также, если, например, Cat реализует собственный SetAge(), и вы хотите вызвать тот из Thing, который вам нужно будет вызвать myCat.Thing.SetAge (42) вместо myCat.SetAge (42).

+0

Разве вы не получаете эту проблему с обычным наследованием на таких языках, как C#? следовательно, вызов base.something() или переопределение методов для скрытия базы? – WeNeedAnswers

+0

Зачем мне реализовывать SetAge в Cat, если я не хочу переопределять? Я все еще могу вызвать метод SetAge в методе Cat SetAge? – WeNeedAnswers

+1

С защищенными полями вы можете напрямую обращаться к ним в методах производных классов. Здесь вам нужно будет создать общедоступные методы доступа для этих областей, даже если вы не хотите публиковать их. Я просто взял метод SetAge() в качестве примера. Но подумайте о любом другом методе из-за логики. Вы не скрываете метод родительского типа, он может быть вызван, как показано выше. – Mue

1

Поскольку вы упомянули C#, попробуйте сделать это в режиме go. Вызов метода не может быть виртуальным в Go (кроме интерфейсов).

// this is C#, not go 
public class Thing 
{ 
    public virtual string Name {get; set;} 
    public virtual int Age {get; set;} 
} 

public class Person : Thing {} 
public class Cat : Thing 
{ 
    public override int Age 
    { 
     get 
     { 
      return base.Age * 7; //age in cat's years 
     } 
    } 
} 

и назвать его так:

Thing t = new Cat() {Name="Tom", Age=5}; // a Cat object is assigned 
             // to a Thing variable 
Console.WriteLine(t.Age); // outputs 35. 
          // t.Age refers to Cat's implementation 
          // of Age, not Thing's. Notice how Age is virtual 
          // in Thing and overridden in Cat 
+0

Проверьте мой код выше ... Я добавил переопределение в Go ... не сделал многое для переопределения ... но он что-то делает. – WeNeedAnswers

+0

отличие не само переопределение. Это как вы это называете (и как виртуальный вызов разрешен для фактического производного типа, который содержит переменная). Если у меня есть время, я попробую добавить встречный пример в Go –

+0

Вы говорите об общей памяти? – WeNeedAnswers

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