2010-11-16 44 views
10

Tôi có một lớp cơ sở được đánh dấu là trừu tượng. Có thể tạo một phương thức trong lớp cơ sở đó chỉ hiển thị với các lớp khác kế thừa lớp cơ sở không?C# - Cách tạo phương thức chỉ hiển thị với các lớp thừa hưởng lớp cơ sở của phương thức

Giả sử tôi có Class1 là lớp cơ sở của tôi và được đánh dấu là trừu tượng. Class2 thừa hưởng Class1 và có thể thực hiện cuộc gọi đến tất cả các phương thức công khai của nó. Tôi muốn Class3 để tạo ra một thể hiện của Class2 nhưng không thể thực hiện cuộc gọi đến các phương thức nhất định của Class1. Tôi đã thử đánh dấu những phương pháp này là bản thân trừu tượng nhưng sau đó tôi gặp lỗi khi Class2 cố gắng sử dụng chúng. Lỗi này là: "... Không thể khai báo nội dung vì nó được đánh dấu là trừu tượng"

Trả lời

16
public abstract class Class1 
{ 
    protected abstract void Method1(); 
    public abstract void Method2(); 
} 

public class Class2 : Class1 
{ 
    protected override void Method1() 
    { 
     //Class3 cannot call this. 
    } 

    public override void Method2() 
    { 
     //class 3 can call this. 
    } 
} 

public class Class3 
{ 
    public void Method() 
    { 
     Class2 c2 = new Class2(); 
     c2.Method1(); //Won't work 
     c2.Method2(); //will work 
    } 
} 

Tại sao không khai báo phương thức protected?

+0

Chính xác những gì tôi đang tìm kiếm. Tôi quên bảo vệ! Cảm ơn – PICyourBrain

5

Có vẻ như bạn đang tìm kiếm từ khóa protected. Điều này giới hạn thành viên được gắn thẻ với protected để chỉ sử dụng cho loại tuyên bố hoặc các loại có nguồn gốc từ loại đó.

abstract class Class1 { 
    protected void Method1() { 
    ... 
    } 
} 

class Class2 : Class1 { 
    public void Method2() { 
    Method1(); // Legal 
    } 
} 

class Class3 { 
    public void Example() { 
    Class2 local = new Class2(); 
    local.Method2(); // Legal 
    local.Method1(); // Illegal since Method1 is protected 
    } 
} 
4

Bạn cần đánh dấu chúng trong cả Class1 và Class2 là protected. Công cụ sửa đổi truy cập này cho phép truy cập lớp dẫn xuất (es) đến một thành viên, nhưng không có gì bên ngoài lớp dẫn xuất có thể thấy nó.

1

Tôi nghĩ bạn muốn có phương thức/trường/thuộc tính protected abstract. Tuy nhiên, bạn sẽ phải sử dụng từ khóa override trong Class2 để thực hiện nó. Điều này cho phép truy cập Class2 vào trường (nếu bạn thực sự muốn nó trừu tượng), nhưng không đưa ra bất kỳ lớp nào không kế thừa từ truy cập class1 vào các trường đó.

Đó là số override sẽ giúp bạn nhận được thông báo Cannot declare a body....

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