假设我们有一个基类(可能来自FrameworkA),其属性名为subject:
public class MyClass { public var subject: String}
我们有一个协议(可能来自FrameworkB),另一个属性但具有相同的名称:
public protocol MyProtocol { var subject: String { get }}
这两个属性代表完全不同的东西.
如何创建一个继承自MyClass并实现MyProtocol的类?
我该如何使用这些属性?
public class SecondClass: MyClass,MyProtocol { var MyProcotol.name: String { // <==== ObvIoUsly not allowed return "something" } var MyClass.name: String { // <==== ObvIoUsly not allowed return "something else" }}
我认为C#允许这样的声明,但我不是100%肯定…
好吧,暂时让我们从使用这些类的代码的角度来看问题,让我们忽略它们的实现方式.事实1
如果secondClass:SecondClass扩展了MyClass,那么我希望能够写:
secondClass.subject
事实2
如果secondClass符合MyProtocol,那么我希望能够写
secondClass.subject
如果我们为secondClass创建一个不同的方式来公开MyClass.subject和MyProtocol.subject,那么我们就打破了面向对象的范式.
事实上
>当你扩展一个类时,你隐式地继承了所有非私有属性和方法,你不能(并且这是一件好事)重命名它们.
>当您遵循协议时,您将完全按照协议中的描述公开所有非可选的声明属性和方法
如果SecondClass重命名了2个属性,就像你的伪代码一样,我们将无法编写类似这样的东西.
let List : [MyClass] = [MyClass(),SecondClass()]for elm in List { println(elm.subject)}
一种可能的(部分)解决方案
你应该避免使用is-a方法来支持has-a.
class SecondClass { let myClass : MyClass let somethingElse : MyProtocol init(myClass : MyClass,somethingElse:MyProtocol) { self.myClass = myClass self.somethingElse = somethingElse } var myClassSubject : String { get { return myClass.subject } } var myProtocolSubject : String { get { return somethingElse.subject } }}
从那以后
> SecondClass不是MyClass和
> SecondClass不是MyProtocol
它没有主题属性消除任何混淆的风险.
希望这可以帮助.
总结以上是内存溢出为你收集整理的swift – 协议之间的实现冲突全部内容,希望文章能够帮你解决swift – 协议之间的实现冲突所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)