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:)
。)
请注意,您的圆形形状的初始值设定项应该采用颜色和半径:
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:)
。)
请注意,您的圆形形状的初始值设定项应该采用颜色和半径: