LINUX.ORG.RU

История изменений

Исправление alysnix, (текущая версия) :

> type doer interface{ Do() }
> 
> type base struct{ doer doer }
> 
> type derived1 struct{}
> 
> type derived2 struct{}
> 
> func (b *base) DoSomething() {
>   b.doer.Do()
> }
> 
> func (d *derived1) Do() { fmt.Println("hello world") }
> 
> func (d *derived2) Do() { fmt.Println("hello existence") }
> 
> func main() {
>   b := &base{
> 	doer: &derived2{},
>   }
> 
> 	b.DoSomething()
> 
> }

что по простому пишется так

class Base {
  virtual void Do();
}

void DoSomething(Base& b) {
   b.Do()
}

class Derived1: public Base {
  void Do() override {fmt.Println("hello world")}
}

class Derived2: public Base {
  void Do() override {fmt.Println("hello existence")}
}

void main() {
  Derived2 b;
  DoSomething(b);
}

отличия очевидны. первый код - кишки наружу. есть просто данные классов, сами по себе, и байндинги к этим данным, которые тоже раскиданы по файлу сами по себе. чтобы понять - какие методы данный «класс» реализует - надо просмотреть весь файл в три тыщи строк. опять же - квазивиртуальный метод Do реализован ручками - через хранение в base указателя на реальную функцию. который потом инитится опять же ручками при создании обьекта. такая вот квази VMT прямо в обьекте. а что если таких методов - десяток?

короче в такой манере можно и на си написать.

второй код - все классы описаны целостно, посмотрел и все понял. Никакой ручной VMT нет. пиши хоть сто виртуальных методов. это и называется ооп

Исходная версия alysnix, :

> type doer interface{ Do() }
> 
> type base struct{ doer doer }
> 
> type derived1 struct{}
> 
> type derived2 struct{}
> 
> func (b *base) DoSomething() {
>   b.doer.Do()
> }
> 
> func (d *derived1) Do() { fmt.Println("hello world") }
> 
> func (d *derived2) Do() { fmt.Println("hello existence") }
> 
> func main() {
>   b := &base{
> 	doer: &derived2{},
>   }
> 
> 	b.DoSomething()
> 
> }

что по простому пишется так

class Base {
  virtual void Do();
}

void DoSomething(Base& b) {
   b->Do()
}

class Derived1: public Base {
  void Do() override {fmt.Println("hello world")}
}

class Derived2: public Base {
  void Do() override {fmt.Println("hello existence")}
}

void main() {
  Derived2 b;
  DoSomething(b);
}

отличия очевидны. первый код - кишки наружу. есть просто данные классов, сами по себе, и байндинги к этим данным, которые тоже раскиданы по файлу сами по себе. чтобы понять - какие методы данный «класс» реализует - надо просмотреть весь файл в три тыщи строк. опять же - квазивиртуальный метод Do реализован ручками - через хранение в base указателя на реальную функцию. который потом инитится опять же ручками при создании обьекта. такая вот квази VMT прямо в обьекте. а что если таких методов - десяток?

короче в такой манере можно и на си написать.

второй код - все классы описаны целостно, посмотрел и все понял. Никакой ручной VMT нет. пиши хоть сто виртуальных методов. это и называется ооп