2011-01-20 37 views
8

Tôi đang cố gắng tìm ra cách tiếp cận tốt nhất để thiết lập và nhận các thuộc tính trong một lớp lồng nhau mà tôi đang tạo.Lớp lồng nhau Các phương thức truy cập cho các thuộc tính trong .NET

Tôi có một lớp, Ô tô có lớp lồng nhau ControlPanel và muốn làm cho các thuộc tính của Bảng điều khiển chỉ có thể truy cập vào lớp Ô tô và Bảng điều khiển.

(ví dụ: không nằm trong vùng lắp ráp hoặc không gian tên và không nằm trong thư viện lớp học sẽ được sử dụng) ... Tôi đã thay đổi thuộc tính truy cập lớp cho bạn bè, bạn bè được bảo vệ, riêng tư, công khai, nhưng bất kỳ kết hợp không phù hợp với kết quả mong đợi của tôi.

Tôi muốn thay đổi thuộc tính trong Drive() Sub của một lớp như được hiển thị bên dưới.

Mọi suy nghĩ?

Public Class Car 

    Dim cp As New ControlPanel 

    Public Class ControlPanel 
     Private _Speedometer As Integer = 0 
     Private _Odometer As Integer = 0 

     Public Property Speedometer() As Integer 
     Get 
      Return _Speedometer 
     End Get 
     Protected Set(ByVal value As Integer) 
      _Speedometer = value 
     End Set 
     End Property 

     Public Property Odometer() As Integer 
     Get 
      Return _Odometer 
     End Get 
     Protected Set(ByVal value As Integer) 
      _Odometer = value 
     End Set 
    End Property 

    End Class 

    Public Sub Drive() 

     cp.Odometer = 76323 
     co.Speedometer = 86 

    End Sub 

End Class 
+0

Bạn có thể mở rộng câu hỏi của mình không? Bạn có muốn * toàn bộ lớp ControlPanel * không thể truy cập được không, hoặc bạn có muốn * chỉ có hai thuộc tính * đó là không thể truy cập được, từ bất kỳ lớp nào khác ngoài Car? Ngoài ra, mã của bạn dường như đề nghị bạn muốn truy cập khác nhau cho getter và setter, nhưng bạn không nói rõ điều này trong câu hỏi. Bạn có muốn truy cập khác nhau cho getter và setter? – Cheeso

+0

Xin lỗi vì sự nhầm lẫn. Những gì tôi muốn thấy là ControlPanel được đọc chỉ từ bên ngoài lớp Car, nhưng Read/Write trong các lớp Car và Control Panel. –

+0

Dựa trên nhận xét đó, những gì tôi nghĩ rằng bạn đang tìm kiếm là những gì tôi đã đề xuất với một lớp lồng nhau tư nhân có một giao diện công cộng (hoặc bạn bè). Điều đó sẽ đảm bảo rằng lớp Car có thể truy cập tất cả các thành viên trên ControlPanel, nhưng bên ngoài sẽ chỉ giữ một tham chiếu của IControlPanel mà sẽ chỉ phơi bày được. Nếu một cái gì đó khác hơn là xe có thể insantiate lớp ControlPanel, bạn có thể cần một số hình thức của nhà máy phương pháp (Tạo) mà trả về IControlPanel. –

Trả lời

3

Bạn có thể làm điều đó như thế này:

Public Class Car 

    Private Interface IControlPanel 
    Property Odometer As Integer 
    Property Speedometer As Integer 
    End Interface 

    Public Class ControlPanel 
    Implements IControlPanel 
    Public ReadOnly Property Odometer As Integer 
     Get 
     Return CType(Me, IControlPanel).Odometer 
     End Get 
    End Property 
    Public ReadOnly Property Speedometer As Integer 
     Get 
     Return CType(Me, IControlPanel).Speedometer 
     End Get 
    End Property 
    Private Property IControlPanel_Odometer As Integer Implements IControlPanel.Odometer 
    Private Property IControlPanel_Speedometer As Integer Implements IControlPanel.Speedometer 
    End Class 

    Dim cp As IControlPanel = New ControlPanel() 

    Public Sub Drive() 
    cp.Odometer = 76323 
    cp.Speedometer = 86 
    End Sub 

End Class 

Nó sử dụng một giao diện tin lồng nhau trong lớp Car với các thành viên thực hiện tư nhân và bí danh trong ControlPanel. Bằng cách này, chỉ Car mới có thể truy cập vào các thành viên giao diện.

+1

Rất cám ơn bạn đã trả lời. –

0

Trước tiên, hãy làm rõ thuật ngữ. Những gì bạn đang nói về ở đây là một lớp "lồng nhau" và không phải là một lớp con

Tôi không tin những gì bạn đang cố gắng làm là có thể trong .NET. Tuy nhiên, bạn có thực sự cần nó? Nếu cp là riêng tư trong ô tô, không ai có thể tăng đồng hồ đo trên bảng điều khiển của ô tô đó. Họ có thể tạo ra bảng điều khiển riêng của họ mà không phải là một phần của một chiếc xe và sau đó gây rối với nó, nhưng những gì gây hại trong đó?

+0

Tôi đã thực hiện ControlPanel riêng tư, nhưng một thuộc tính trong lớp Car làm cho nó có sẵn. tức là: (MyCar.ControlPanel.Odometer) –

4

Như Robert Levy chỉ ra, bạn đang đề cập đến một "Nested Class" và không phải là một "Subclass" vv

Đối với làm thế nào để đạt được những gì bạn đang tìm kiếm ... Bạn chỉ đơn giản là tìm cách để làm ControlPanel một lớp học tư nhân? Điều đó sẽ đảm bảo rằng tất cả các thành viên của ControlPanel chỉ có thể truy cập vào ô tô. Nếu bạn có các thành viên khác trên ControlPanel cần phải được tiếp xúc, hoặc bên ngoài thế giới cần giữ một tham chiếu đến ControlPanel trong một thời gian nào đó, hãy cân nhắc sử dụng Giao diện để chỉ hiển thị những thành viên mà bạn muốn công khai.

Public Class Car 

    Dim cp As New ControlPanel 

    Private Class ControlPanel 

    Public Property Speedometer As Integer 
    Public Property Odometer As Integer 

    End Class 

    Public Sub Drive() 
    cp.Odometer = 76323 
    cp.Speedometer = 86 
    End Sub 

End Class 

Tùy chọn ...

Friend Interface IControlPanel 
    //Whatever actually needs to be publically accessible.  
End Interface 

// Other Code... 

Private Class ControlPanel 
    Implements IControlPanel 

// Other Code... 

mục tiêu mà bạn đang cố gắng để đạt được về API là gì?

+0

Mục đích tôi đang cố gắng đạt được là mô đun. Thay vì tạo ra 100 thuộc tính ở cấp độ Xe, tôi muốn phá vỡ các tính thích hợp liên quan đến nhau trong các lớp "thư mục" này. –

0

Đặt riêng cho lớp học ControlPanel của bạn và các thuộc tính của nó công khai. Lớp ControlPanel sẽ chỉ hiển thị với loại Car, nhưng Car sẽ vẫn có thể sửa đổi các thuộc tính của ControlPanel.

+0

Bảng điều khiển vẫn phải được hiển thị công khai dưới dạng chỉ đọc bên ngoài lớp Ô tô. Bảng điều khiển nên được abe để đọc/ghi vào ControlPanel. –

+0

Các giá trị cho đồng hồ đo tốc độ và đồng hồ tốc độ cũng là giá trị giữ chỗ. Các trường này sẽ được liên kết với một cơ sở dữ liệu và có thể hiển thị theo yêu cầu. (ví dụ: MyCar.ControlPanel.Speedometer) –

0

các lớp lồng nhau là một cách để đi hoặc bạn có thể đặt ô tô của mình làm lớp kết hợp. Bảng điều khiển có thể được sử dụng trong nhiều xe ô tô khác nhau (các lớp phụ) vậy tại sao làm cho nó lồng nhau? Xe có Bảng điều khiển. Xe có Động cơ

Xe buýt: Xe cũng có những thứ đó.

Radio có thể là nội dung mà Control Panel có.Công tơ mét có thể là một phần của Bảng điều khiển cũng có thể là một phần của Bảng điều khiển.

Sau đó, bạn kết thúc với

MyCar.ItsControlPanel.Radio MyCar.ItsControlPanel.Dashboard.Speedometer.CurrentSpeed;

Làm thế nào về xe máy? Nó không phải là một chiếc xe nhưng nó vẫn có một Bảng điều khiển trong đó có một đồng hồ tốc độ.

Nhận điểm của tôi? Đối tượng tổng hợp.

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