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中似乎没有一个好的编译时解决方案,这很令人沮丧,但由于没有解决方案,您的答案似乎是正确的,所以我将其标记为正确的。