Swift-Force派生类实现静态方法

Swift-Force派生类实现静态方法,swift,static,abstract,Swift,Static,Abstract,我想强制所有从基类派生的类必须实现一个静态变量,而不强制每个派生类实现一个协议 以下是一个示例: enum SomeEnum { case BaseType case DerivedType } protocol Typed { static var classType: SomeEnum { get } } class BaseClass : Typed { static var classType: SomeEnum = SomeEnum.BaseType

我想强制所有从基类派生的类必须实现一个静态变量,而不强制每个派生类实现一个协议

以下是一个示例:

enum SomeEnum {
    case BaseType
    case DerivedType
}

protocol Typed {
    static var classType: SomeEnum { get }
}

class BaseClass : Typed {
    static var classType: SomeEnum = SomeEnum.BaseType
}

class DerivedClass : BaseClass {
    // ERROR: Cannot override with a stored property 'classType'
    static var classType: SomeEnum = SomeEnum.DerivedType
}
下面的代码可以工作,但要求从
基类
派生的每个类的实现者记住也要从协议
类型化
派生,这也意味着
基类
本身不能定义
类类型

class BaseClass {
}

class DerivedClass : BaseClass, Typed {
    static var classType: SomeEnum = SomeEnum.DerivedType
}
下面的示例也不起作用,我得到一个不同的错误:

class BaseClass {
    static var classType: SomeEnum {
        get { return SomeEnum.BaseType }
    }
}

class DerivedClass : BaseClass {
    // ERROR: Class var overrides 'final' class var
    static var classType: SomeEnum {
        get { return SomeEnum.DerivedType }
    }
}

这是一个继承问题。在继承中,子类不能声明变量名等于基类变量名。这是因为子类将从基类获取所有公共方法和变量,所以您不能这样做。获取子类的新变量

看起来是这样的:

class DerivedClass : BaseClass {
    static var newclassType : SomeEnum = SomeEnum.DerivedType
}

子类无法重新定义变量(它已经存在)。应改为在初始化期间进行设置

protocol Typed {
    var classType: SomeEnum { get }
}

class BaseClass : Typed {
    var classType: SomeEnum = SomeEnum.BaseType
}

class DerivedClass : BaseClass {
    override init() {
        super.init()
        classType = SomeEnum.DerivedType
    }
}

据我所知,在Swift(或Objective-C)中,类不可能强制其子类重新定义方法或设置属性。

这种方法的问题是不需要派生类实现静态变量。我需要所有派生类型都具有此静态信息。其他语言允许,但我是新的SWIFT,所以我希望它是在Swift中可用的,也许我只是不知道怎么做。我尝试过其他语言,我使用C++,C++没有协议。用虚拟函数代替协议是一种新方法。情况就像你说的那样。我认为苹果不能在SWIFT中改变这个属性,这是因为SWIFT是强大的类型语言。在C++中,基类可以有一个纯的虚拟方法(抽象),强制所有派生类实现一个方法(编译时执行)。在Swift中,似乎只有在未实现的情况下调用fatalError()才能实现这一点,只有在运行时才能实现。在C#中,您可以有一个抽象类来强制执行此要求,也可以有一个接口。您提供了一个指向抽象类数据的链接。我希望有一个像C++/C#provide这样的抽象类,这就是我想要复制的。使用抽象类,我可以实现方法和变量,但也需要派生类实现特定的方法。我看不出用Swift可以做到这一点。在Swift中似乎没有一个好的编译时解决方案,这很令人沮丧,但由于没有解决方案,您的答案似乎是正确的,所以我将其标记为正确的。