2017-01-06 1 views
1

code running in xcodeМожет ли подкласс наследовать свойство типа из его суперкласса? И если да, как его переопределить?

«Для свойств вычисленных типа для типов классов, вы можете использовать класс ключевое слово вместо того, чтобы позволить подклассы, чтобы переопределить реализацию суперкласса.»

«Вы можете переопределить унаследованное экземпляр или тип собственности, чтобы обеспечить ваш собственный пользовательский геттер и сеттер для этого свойства» ---- Apple, Swift3

//override static 
class A{ 
    var myValue = 0614 
    static var storedTypeProperty = "Some value" 
    class var overrideableComputedTypeProperty: Int { 
     return 1 
    } 
} 
class B: A { 
    storedTypeProperty = "New String" 
} 

Похоже, что B не наследует любое свойство типа из A. Так как OV забудьте «свойство унаследованного типа», как описано выше в книге Swift3.

+0

Чего вы хотите достичь? Вы не можете переопределить свойство 'static', но вы можете сделать это с другими переменными. – NSDmitry

+0

Я не понимаю, что означают эти два предложения, как указано в Swift3. В нем говорится, что вы можете переопределить свойство унаследованного типа, чтобы предоставить собственный пользовательский getter и setter для этого свойства. – cary

ответ

0

Проблема, с которой вы сталкиваетесь, заключается в том, что вы используете переменную static. static переменные не могут быть перезаписаны, полная остановка. Нет смысла спорить здесь.

Первое предложение говорит, если у вас есть class (а не struct), как class A {}, вы можете использовать ключевое слово class вместо static ключевого слова, и переопределить типы классов. Это означает, что вы можете использовать два ключевых слова для той же цели, с большой разницей, что static не может быть перезаписано.

class A { 
    // overridable computed property 
    class var overridableClassPropery: String { 
     return "This is class A's overwritten property" 
    } 

    // Not overridable `static` computed property 
    // Error will be shown if you try to override this property in class `B` 
    static var notOverridableStaticPropery: String { 
     return "Can not override this property in a subclass" 
    } 
} 

Второй говорит, что вы можете переопределить свойство Суперклассов класса, а также обеспечить собственную get реализацию в подклассе, как следующее:

class B: A { 
    // Class type computed property can be overwritten 
    override class var overridableClassPropery: String { 
     return "This is class B's overwritten property" 
    } 
} 

EDIT:

notOverridableStaticPropery из class A наследуется class B, что означает, вы можете получить доступ к нему или позвонить по нему через class B. BUT вы не можете переопределить его, он будет иметь значение, установленное в class A всегда.

print(A.notOverridableStaticPropery) // prints "This is class A's not overridable static property" 
print(B.notOverridableStaticPropery) // prints "This is class A's not overridable static property" 
+0

Хорошо, я еще не понял, что во втором предложении он упоминал «свойство унаследованного типа», поэтому B должен наследовать свойство типа «notOverridableStaticProperty» из A, но я не могу называть это свойство типа Б, что я пропустил? – cary

+0

отредактировал мой ответ. – dirtydanee

+0

Моя проблема решена. Большое спасибо – cary

Смежные вопросы