2011-03-16 39 views
6

Hàm tạo của lớp con "caesar" đưa ra lỗi. Nó nói rằng tên, loại là không thể tiếp cận do mức độ bảo vệ của nó. Làm thế nào mà? Vì đây là lớp con có nguồn gốc từ lớp "Mật mã" nên không nên đưa ra lỗi như thế này. Làm thế nào tôi có thể vượt qua tình trạng này. Nhưng tôi muốn các biến đó là riêng tư. Tôi không muốn thay đổi chúng thành công khai.Lỗi C# "không thể truy cập được do mức độ bảo vệ" trong hàm tạo

*** Ví dụ về mã thứ hai hoạt động. Ai có thể thấy sự khác biệt không?

namespace Encrypter 
{ 
    class Cipher 
    { 
     public Cipher(string name, string type) 
     { 
      setName(name); 
      setType(type); 

     } 
     private string name; 
     private string type; 

     public void setName(string newName) 
     { 
      name = newName; 
     } 
     public string getName() 
     { 
      return name; 
     } 
     public void setType(string newType) 
     { 
      type = newType; 
     } 
     public string getType() 
     { 
      return type; 
     } 
     public string encrypt(string text) 
     { 
      return text; 
     } 
     public string decrypt(string text) 
     { 
      return text; 
     } 
    } 
} 




namespace Encrypter 
{ 
    class Caesar : Cipher 
    { 

     private int shiftamount; 
     private string shiftdirection; 
     public Caesar(int shiftamount, string shiftdirection) : base(name, type) 
     { 
      setShiftamount(shiftamount); 
      setShiftdirection(shiftdirection); 
     } 
     public void setShiftamount(int newShiftamount) 
     { 
      shiftamount = newShiftamount; 
     } 
     public int getShiftamount() 
     { 
      return shiftamount; 
     } 
     public void setShiftdirection(string newShiftdirection) 
     { 
      shiftdirection = newShiftdirection; 
     } 
     public string getShiftdirection() 
     { 
      return shiftdirection; 
     } 

    } 
} 

----------------------------- Chỉnh sửa mới ------------ ----

class MyFile 
    { 
     public MyFile(int id, string name, int size, string type) 
     { 
      setId(id); 
      setName(name); 
      setSize(size); 
      setType(type); 

     } 
     private int id; 
     private string name; 
     private string type; 
     private int size; 




class Movie : MyFile 
    { 
     private string director; 
     private int release_year; 
     public Movie(string director, int release_year, int id, string name, int size) : base(id, name, size, "m") 
     { 
      setDirector(director); 
      setRelease_year(release_year); 
     } 
+16

Gah! Bạn đang sử dụng C# ... sử dụng Properties thay vì các phương thức getter/setter. –

+0

[nguyên tắc đặt tên] (http://msdn.microsoft.com/en-us/library/xzf533w0%28v=vs.71%29.aspx) có thể là một đọc tốt cho các poster quá. Mã trông rất giống Java. ;-) – mpontillo

+0

Vâng thực sự ngôn ngữ preffered của tôi là Java nên tôi rất quen với nó. Như C# là tương tự như Java, tôi sử dụng thói quen lập trình java của tôi trong C# quá: D Nhưng yeah bạn là đúng anyway :) – Alptugay

Trả lời

7

Có vẻ như bạn đã nhầm lẫn khi xác định hàm tạo lớp dẫn xuất. Nếu bạn muốn nhận các giá trị nametype cho siêu lớp, bạn sẽ phải chuyển chúng vào làm đối số hàm tạo bổ sung (cho tổng số 4 đối số trong hàm tạo lớp dẫn xuất.) Ví dụ: thay đổi thành giá trị này sẽ hoạt động:

public Caesar(int shiftamount, 
        string shiftdirection, 
        string name, 
        string type) 
        : base(name, type) 

Có một số chiến lược khác bạn có thể thực hiện.

+0

Oh bạn là đúng. Tôi vừa mới chỉnh sửa bài đăng của mình. Và nó cũng giống như bạn đã nói. Cảm ơn bạn – Alptugay

3

Không thể truy cập thành viên cá nhân từ lớp học có nguồn gốc. bảo vệ và công cộng có thể. Bạn phải bảo vệ chúng. Bằng cách này, chỉ có lớp và "trẻ em" của nó sẽ có quyền truy cập.

Tóm tắt quyền truy cập:

  • private: thể được truy cập chỉ từ đó phương pháp lớp học, không có gì khác
  • protected: thể được truy cập từ buổi học và phương pháp con của nó của
  • internal: thể được truy cập chỉ từ các phương thức trong cùng một assembly
  • protected internal: giống như các phương thức + nội bộ của các lớp dẫn xuất từ ​​các assembly khác
  • .210
  • public: có thể được truy cập bởi tất cả mọi người
3

private nghĩa là chỉ lớp tuyên bố có thể truy cập các thành viên (có nghĩa là loại di truyền không thể, hoặc là).

protected có nghĩa là lớp khai báo và bất kỳ hậu duệ nào cũng có thể truy cập vào các thành viên, nhưng các loại bên ngoài không thể.

Trên một lưu ý khác, các hàm getter và setter thường không được sử dụng trong các ngôn ngữ .NET. Thuộc tính đóng gói chức năng này và là những gì nên được sử dụng để thay thế. Ví dụ;

private string name; 

public string Name 
{ 
    get { return name; } 
    set { name = value; } 
} 
5
public Caesar(int shiftamount, string shiftdirection) 
     : base(name, type) 
    { 

Vấn đề là tên private lĩnh vực và loại - lớp trẻ không thể truy cập vào chúng trừ khi chúng được đánh dấu là protected. Điều bạn thực sự muốn tôi nghi ngờ là

public Caesar(int shiftamount, string shiftdirection) 
     : base("Caesar5", "Caesar") 
    { 
Các vấn đề liên quan