zoukankan      html  css  js  c++  java
  • Go如何使用实现继承的组合

    Go它提供了一个非常值得称道的并发支持,但Go它不支持完全面向对象的。这并不意味着Go不支持面向对象,,和Go的OO系统做的很轻巧,学习降至最低成本。向对象让Go失去了一些OO的方便特性,可是更高的效率和多返回值多少弥补了这一点。


    那些全然支持面向对象的语言一般都具有继承的功能。继承有非常棒的长处,最简单了讲。就是能够少写代码。当然,继承并不不过让你省了敲几下键盘的功夫,它还能更好的抽象程序中各种类型之间的关系。


    Go的OO系统不支持继承。可是能够使用Go中一种叫做"组合"的方法来实现继承。以下演示两段程序,看过了之后你就会明确Go的这样的组合技巧了。


    C++中的继承:

    #include <iostream>
    using namespace std;
    
    class Person {
    public:
        void Say();
    };
    void Person::Say() {
        cout << "I'm a person." << endl;
    }
    
    // 继承
    class Student : public Person {
    };
    
    int main() {
        Student s;
        s.Say();
        return 0;
    }

    等效的Go程序:

    package main
    
    type Person struct {
    }
    func (p *Person) Say() {
        println("I'm a person.")
    }
    
    // 组合
    type Student struct {
        Person
    }
    
    func main() {
        var s Student
        s.Say()
    }

    这两个程序执行之后结果都是: 

    I'm a person.


    能够看出Go能够通过组合还有一个类型来"继承"它的全部行为。十分直观。只是C++和Go的这两段代码表达的意义事实上还是有些稍微的区别。C++的类继承表示Person是Student的一个父类,具有一种层次关系。可是Go的组合则表达了一种Student是个人,所以Student包括了Person的全部行为。即人能做的事情Student就能做,Student骨子里也是个人。


    不管是继承还是组合,"复制"来的行为都是能够重写的~

    希望这篇博文让你学会了Go的组合。



    假设转载请注明出处:http://blog.csdn.net/gophers


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    bzoj 1030 [JSOI2007]文本生成器
    Swift 学习笔记 (闭包)
    Swift 学习笔记 (函数)
    HTML 学习笔记 JQueryUI(Interactions,Widgets)
    HTML 学习笔记 JQuery(表单,表格 操作)
    HTML 学习笔记 JQuery(animation)
    HTML 学习笔记 JQuery(盒子操作)
    HTML 学习笔记 JQuery(事件)
    HTML 学习笔记 JQuery(DOM 操作3)
    HTML 学习笔记 JQuery(DOM 操作2)
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4620699.html
Copyright © 2011-2022 走看看