История изменений
Исправление 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 нет. пиши хоть сто виртуальных методов. это и называется ооп