【问题标题】:Swift Multiple Inheritance. I am trying to recreate this Java Code in Swift related to Multiple InheritanceSwift 多重继承。我正在尝试在与多重继承相关的 Swift 中重新创建此 Java 代码
【发布时间】:2021-07-02 12:46:27
【问题描述】:
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
    }


   }

我编写了代码来创建一个接口“color”、一个超类“shape”和一个子类“Circle”。目的是作为一个新程序员了解更多关于继承和多重继承的知识。 Java 代码按预期工作。

但我收到一个错误“在从初始化程序返回之前,所有路径上都没有调用'super.init'”,上面的 Swift 代码。由于我是 swift 和多重继承的新手,我不知道如何纠正这个错误。

我该如何纠正这个问题?

【问题讨论】:

    标签: java swift inheritance multiple-inheritance paradigms


    【解决方案1】:

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

    C++ 有,还有一些其他的。

    在 Swift 中,您可以使用协议来完成非常相似的事情,但符合协议与从父类继承不是一回事。

    您的问题是您的初始化程序需要调用其父类的初始化程序:

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

    (Circle 需要调用 super.init,或者在这种情况下,从其形状超类调用 init(colour:)。)

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

    【讨论】:

    • 感谢您的回复。我已经这样做了,但现在又出现 2 个错误“属性 'self.radius' 未在 super.init 调用时初始化”和“不可变值 'self.radius' 只能初始化一次”。我唯一更改的是我的 init 函数,它现在与您提出的代码完全相同。谢谢
    • 抱歉,这两行的顺序有误。您应该在调用 self.init 之前设置实例变量。请参阅我的答案的编辑。
    • 如果我的回答解决了你的问题,你应该接受它。
    【解决方案2】:

    您的错误与超类的初始化有关。每当您继承超类时,要对其进行初始化,您必须在 Circle 类的初始化程序的第一行写上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
        }
    

    【讨论】:

    • 你点击提交的速度比我快。你赢了。
    猜你喜欢
    • 1970-01-01
    • 2019-04-14
    • 2014-12-27
    • 2012-06-02
    • 1970-01-01
    • 2018-01-31
    • 2013-07-24
    • 2015-11-11
    • 2014-03-16
    相关资源
    最近更新 更多