Swift 多重继承。我正在尝试在 Swift 中重新创建与多重继承相关的 Java 代码

Swift Multiple Inheritance. I am trying to recreate this Java Code in Swift related to Multiple Inheritance

public class Shape {
     public static void main (String[] args) {
    

        Circle c = new Circle(5);
        System.out.println (c.getArea());
        c.setColour("Green");
        System.out.println (c.getColour());

  
    }
}

    interface Colour {
        String getColour();
        void setColour (String colour);
    }

    abstract class Shapes implements Colour {
        abstract double getArea();
        private String colour = "Red";

    public String getColour() {
        return colour;
    }
    public void setColour(String colour) {
        this.colour = colour;
    }

}
class Circle extends Shapes {
    private int radius;

    public Circle(int radius) {
    this.radius = radius;
}



    public double getArea() {
        return Math.PI * radius * radius;
    }
}

我尝试了Swift解决方案,代码如下

import Cocoa

protocol Colour {
    var colour: String { get set }

    func getColour() -> (String)
    func setColour(colour: String)

}

class Shape: Colour {
    var colour: String = "Red"

    init(colour: String) {
        self.colour = colour
    }

    func getColour() -> (String) {
        return colour
    }

    func setColour(colour: String) {
        self.colour = colour
    }

    func getArea() -> Double {
        return 0.0
    }



}

class Circle: Shape {
    let radius: Double


    init(radius: Double) {
        self.radius = radius
    }

    override func getArea() -> Double {
        return radius * radius * Double.pi
    }


   }

我编写了代码来创建接口 'colour'、超级 class 'shape' 和子 class 'Circle'。目的是作为新程序员更多地了解继承和多重继承。 java 代码按预期工作。

但是我收到一个错误“'super.init' 在从初始值设定项返回之前没有在所有路径上被调用”,上面的 Swift 代码。由于我是 swift 和多重继承的新手,所以我不确定如何更正此错误。

我该如何纠正这个问题?

您的错误与超级classes 的初始化有关。每当您继承 superclass 时,要初始化它,您必须在 Circle class 的初始化程序的第一行写入 super.init()

//Inside of Circle class

 init(radius: Double) {
//I've initialized shape using the color Red, but you can use any string.
        super.init(color: "Red")
        self.radius = radius
    }

Swift 和 Java 都不支持多重继承。

C++ 和其他一些。

在 Swift 中,您可以使用协议来完成非常相似的事情,但是遵守协议与从父级继承是不一样的 class。

你的问题是你的初始化器需要调用它的父 class' 初始化器:

init(radius: Double, color: String) {
    self.radius = radius
    super.init(color: color)
}

(Circle 需要调用 super.init,或者在本例中,从它的形状 superclass 调用 init(colour:)。)

请注意,您的圆形形状的初始值设定项应该采用颜色和半径: