zoukankan      html  css  js  c++  java
  • Multiple inheritance in Go

    原文:http://golangtutorials.blogspot.com/2011/06/multiple-inheritance-in-go.html

     

    ------------------------------------------------------------------------------------------------------------

    Inheritance is the ability for a type to automatically obtain the behaviors of a parent class. Multiple inheritance is the ability for a type to obtain the behaviors of more than one parent class. As a real world example, if Phone was a type, then MobilePhone could be a type that inherits the behavior of the Phone type. This works in many cases, but not in all. What would happen to say a type, CameraPhone that has to have the behaviors of both a Camera and a Phone? One straightforward way to solve this would be to be able to inherit from both. (Note that in this simple example, it is possible to put a camera in a phone or a phone in a camera, but it is not always the case - say a child who inherits the behaviors or features of each of his parents.)

    Some object oriented languages used to solve this by denying that multiple inheritance is ever necessary. Others work around the difficulties by providing what is called an interface and the ability for a sub type to subclass one type, but implement many interfaces. Go on the other hand has multiple inheritance. The way to get it is exactly the same way as we did for single inheritance that we already looked at, using anonymous fields. Let’s implement our Camera+Phone=CameraPhone example.

    Full code

    package main
    
    import "fmt"
    
    type Camera struct { } 
    
    func (_ Camera) takePicture() string { //not using the type, so discard it by putting a _
        return "Click"
    }
    
    type Phone struct { } 
    
    func (_ Phone ) call() string { //not using the type, so discard it by putting a _
        return "Ring Ring"
    }
    
    // multiple inheritance
    type CameraPhone struct {
        Camera //has anonymous camera
        Phone //has anonymous phone 
    }
    
    func main() {
        cp := new (CameraPhone)  //a new camera phone instance
        fmt.Println("Our new CameraPhone exhibits multiple behaviors ...")
        fmt.Println("It can take a picture: ", cp.takePicture()) //exhibits behavior of a Camera
        fmt.Println("It can also make calls: ", cp.call()) //... and also that of a Phone
    }
    
    
    Our new CameraPhone exhibits multiple behaviors ...
    It can take a picture: Click
    It can also make calls: Ring Ring


    In the above code, there is a Camera type and a Phone type. By having an anonymous type of each in CameraPhone, we are able to reach into the behavior of each of them as if they were direct behaviors of CameraPhone.

    As you might start to notice, the number of paradigms in Go are fairly less, but they have significant extensibility on the design of the rest of the language.

  • 相关阅读:
    JVM垃圾回收之三色标记
    负载均衡之LVS与Nginx对比
    浅析虚拟机内存管理模型
    JVM调优之垃圾定位、垃圾回收算法、垃圾处理器对比
    JAVA对象分析之偏向锁、轻量级锁、重量级锁升级过程
    全局负载均衡与CDN内容分发
    内存屏障在CPU、JVM、JDK中的实现
    JVM类加载与双亲委派机制被打破
    JVM虚拟机Class类文件研究分析
    Redis分布式锁升级版RedLock及SpringBoot实现
  • 原文地址:https://www.cnblogs.com/oxspirt/p/11650923.html
Copyright © 2011-2022 走看看