2016-04-16 11 views
6

Ho una classe super-rapida: Come posso sovrascrivo un metodo pubblico nella superclasse di essere un metodo privato nella sottoclasse

class father{ 
    public doSomething(){ 

    } 
} 

voglio questa classe bambino di essere

class child: father{ 
    private override doSomething{ 

    } 

} 

ma Xcode dice che

metodo istanza fondamentale debba essere il più accessibile la dichiarazione, sostituzioni

così, come posso l'override un metodo pubblico in superclasse essere un metodo privato nella sottoclasse

GRAZIE

risposta

9

È possibile non perché che possa violare la Liskov Substitution Principle.

In sostanza, qualsiasi codice che può operare su un'istanza di una superclasse deve anche essere in grado di operare su un'istanza della sottoclasse.

Quindi, se qualche altra classe ha un metodo

class Unrelated { 
    func operateOnAThing(someThing:Father) { 
     someThing.doSomething() 
    } 
} 

allora deve ancora lavorare quando si effettuano le seguenti operazioni:

let aChild = Child() 

unrelatedInstance.operateOnAThing(aChild) 

Se il metodo di doSomething aveva accesso più restrittivo nel Child classe allora si otterrebbe un errore di runtime. Per evitare ciò, non è possibile rendere l'accesso più restrittivo in una sottoclasse.

+0

Grazie mille, non voglio che qualcuno acceda a DoSomething() da Child mentre Father ha il metodo pubblico doSomething(), c'è un modo per rendermi felice? –

+0

Si potrebbero avere due metodi 'doSomething' e un metodo privato' reallyDoSomething'. Nella superclasse 'doSomething 'chiamerebbe' reallyDoSomething'. Nella sottoclasse 'doSomething' genererebbe un'eccezione o qualcosa del genere. La sottoclasse può avere qualsiasi implementazione di 'reallyDoSomething' appropriata – Paulw11

+0

infatti so che funziona ma non voglio questo, qualcuno potrebbe chiamare doSomething in Child, grazie ancora, potrebbe essere l'unico modo. –

Problemi correlati