Java Swift中的抽象类

Java Swift中的抽象类,java,ios,swift,Java,Ios,Swift,过去几年我一直在Java工作,现在正在学习Swift。我试图在Swift中实现Java抽象类,发现Swift不支持它。我还看到,抽象类可以通过协议实现,但是由于我的类包含泛型类型,我对它有点困惑 我创建了一个Java类结构,并试图将其转换为Swift,但失败了。这是课程 import java.util.List; import java.util.ArrayList; public class HelloWorld{ public static void main(String

过去几年我一直在
Java
工作,现在正在学习
Swift
。我试图在
Swift
中实现
Java
抽象类,发现
Swift
不支持它。我还看到,
抽象
类可以通过
协议
实现,但是由于我的类包含泛型类型,我对它有点困惑

我创建了一个
Java
类结构,并试图将其转换为Swift,但失败了。这是课程

import java.util.List;
import java.util.ArrayList;

public class HelloWorld{

     public static void main(String []args){
        D d = new D();
        d.sayHello();
        d.sayHi();
        d.sayGracias();

        System.out.println(d.get("Hello"));
     }

     static class A{
         public void sayHello(){
             System.out.println("Hello from A");
         }
     }

     static class B<R> extends A{
        public void sayHi(){
            System.out.println("Hi from B");
        }   
     }

     static abstract class C<M,R> extends B<R>{

         public abstract List<M> get(R r);

         public void sayGracias(){
            System.out.println("Gracias from C");
         } 
     }

     static class D extends C<String, String>{

         @Override 
         public List<String> get(String s){
             List<String> list = new ArrayList<String>();
             list.add(s);
             return list;
         }
     }

}
问我所有关于这个话题的疑问和问题都会一团糟。因此,转换后的代码
(Java->Swift)
将解决我所有的疑问。有谁能帮我把上面的代码转换成
Swift


注意:我需要像Java中那样的强制重写。

我强烈建议您在Swift中重新设计您的模型。就像翻译口语一样,结果可能听起来很尴尬,而编程语言在翻译时也可能看起来很尴尬。如果您仍然想从Java翻译,请继续阅读


这里真正难以解决的问题是
B
是泛型的。如果
B
不是通用的,那么在Swift中一切都会运行得更好

现在,您只需使用一个
,并假设它是一个协议:

class A {
    func sayHello() {
        print("Hello from A")
    }
}

class B<R> : A {
    func sayHi() {
        print("Hi from B")
    }
}

class C<M, R> : B<R> {
    // this fatalError() thing is really ugly, but I can't think of any other workarounds
    func get(r: R) -> [M] { fatalError() }
    func sayGracias() {
        print("Gracias from C")
    }
}

class D : C<String, String> {
    override func get(r: String) -> [String] {
        return [r]
    }
}

let d = D()
d.sayHello()
d.sayHi()
d.sayGracias()
print(d.get(r: "Hello"))

Swift中没有抽象类(就像Objective-C一样)。您最好的选择是使用协议,它类似于Java接口。我尝试过,但由于我的类包含泛型类型,而协议不支持泛型类型,所以我无法完成它。:/我需要获得
Swift
版本的
Java
代码。它将回答我脑海中的所有问题。参考此链接:协议就像一个函数,函数支持通用类型。您可以使用j2objc库将java类转换为对象c,并由此创建桥接头并在swift中访问该类。参见:B在我的案例中是通用的。即使类
D
没有实现/重写方法
get(r:String)
,它仍然可以编译。有什么东西阻止编译吗。我想这就是java中的
abstract
所做的。@theapache64我不这么认为。像SwiftLint这样的东西可能会帮你这么做,我不确定。为什么不尝试重新设计您的模型?重新设计模型可能会解决问题。但我想用这个模型找到一个解决方案。我只是想知道这是否可能,或者我不知道的任何方法。谢谢你的回复,伙计。:)
class A {
    func sayHello() {
        print("Hello from A")
    }
}

class B<R> : A {
    func sayHi() {
        print("Hi from B")
    }
}

class C<M, R> : B<R> {
    // this fatalError() thing is really ugly, but I can't think of any other workarounds
    func get(r: R) -> [M] { fatalError() }
    func sayGracias() {
        print("Gracias from C")
    }
}

class D : C<String, String> {
    override func get(r: String) -> [String] {
        return [r]
    }
}

let d = D()
d.sayHello()
d.sayHi()
d.sayGracias()
print(d.get(r: "Hello"))
class A {
    func sayHello() {
        print("Hello from A")
    }
}

class B : A {
    func sayHi() {
        print("Hi from B")
    }
}

protocol C {
    // associated types in Swift are kind of like generic parameters for protocols
    associatedtype M
    associatedtype R
    func get(r: R) -> [M]
}

extension C {
    func sayGracias() {
        print("Gracias from C")
    }
}

// You have to specify that D inherits from B as well since protocols can't inherit from classes
class D : B, C {
    typealias M = String
    typealias R = String

    func get(r: String) -> [String] {
        return [r]
    }
}

let d = D()
d.sayHello()
d.sayHi()
d.sayGracias()
print(d.get(r: "Hello"))