2016-04-16 19 views
6

Tôi có một lớp siêunhanh: Làm thế nào tôi có thể ghi đè lên một phương pháp nào trong lớp cha là một phương pháp tư nhân trong lớp con

class father{ 
    public doSomething(){ 

    } 
} 

Tôi muốn lớp trẻ này là

class child: father{ 
    private override doSomething{ 

    } 

} 

nhưng Xcode nói rằng

Phương pháp thể hiện ghi đè phải có thể truy cập được như khai báo ghi đè

như vậy, làm thế nào tôi có thể ghi đè lên một phương pháp nào trong lớp cha là một phương pháp tư nhân trong lớp con

THANK YOU

Trả lời

9

Bạn có thể không phải vì điều đó sẽ vi phạm Liskov Substitution Principle.

Về cơ bản, bất kỳ mã nào có thể hoạt động trên một cá thể của một siêu lớp cũng phải có khả năng hoạt động trên một cá thể của lớp con của bạn.

Vì vậy, nếu một số lớp khác có một phương pháp

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

sau đó nó vẫn phải làm việc khi bạn làm như sau:

let aChild = Child() 

unrelatedInstance.operateOnAThing(aChild) 

Nếu phương pháp doSomething có quyền truy cập hạn chế hơn trong Child lớp sau đó bạn sẽ nhận được một lỗi thời gian chạy. Để ngăn chặn điều này, bạn không thể truy cập hạn chế hơn trong một lớp con.

+0

cảm ơn bạn rất nhiều, tôi không muốn bất kỳ ai truy cập doSomething() từ Trẻ em trong khi Cha có phương thức công khai doSomething(), có cách nào để làm tôi hạnh phúc không? –

+0

Bạn có thể có hai phương thức 'doSomething' và một phương thức riêng' reallyDoSomething'. Trong superclass 'doSomething' sẽ gọi' reallyDoSomething'. Trong lớp con 'doSomething' sẽ ném một ngoại lệ hoặc một cái gì đó. Lớp con có thể có bất kỳ việc thực thi 'reallyDoSomething' nào là thích hợp – Paulw11

+0

trong thực tế tôi biết điều này làm việc nhưng tôi không muốn điều này, ai đó có thể gọi doSomething trong Child, cảm ơn bạn rất nhiều lần nữa, nó có thể là cách duy nhất. –

Các vấn đề liên quan