2011-01-20 1 views
8

Я пытаюсь найти лучший подход для настройки и получения свойств во вложенном классе, который я создаю.Вложенные классы Способы доступа для свойств в .NET

У меня есть класс, автомобиль, который имеет вложенный класс ControlPanel и хочет, чтобы свойства панели управления были доступны только классу Car and Control Panel.

(т. Е. Не внутри сборки или пространства имен, а не внутри приложения, будет использоваться библиотека классов) ... Я изменил свойства доступа класса к другу, защищенному другу, частному, общедоступному, но любой комбинация не соответствует моим ожидаемым результатам.

Я хочу изменить свойства в Sub() Sub класса, как показано ниже.

Любые мысли?

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

Вы можете добавить свой отзыв? Вы хотите, чтобы * весь класс ControlPanel * был недоступен или вы хотите, чтобы * только те два свойства * были недоступны, из любого класса, кроме Car? Кроме того, ваш код, по-видимому, предполагает, что вам нужен другой доступ для геттера и сеттера, но вы не сформулируете это четко в вопросе. Вам нужен другой доступ для геттера и сеттера? – Cheeso

+0

Извиняется за замешательство. То, что я хотел бы видеть, - это ControlPanel для чтения только вне класса Car, но чтение/запись в классах Car and Control Panel. –

+0

Основываясь на этом комментарии, то, что я думаю, что вы ищете, - это то, что я предложил с помощью частного вложенного класса, который имеет открытый (или дружественный) интерфейс. Это гарантирует, что класс Car может получить доступ ко всем членам ControlPanel, но внешняя сторона будет поддерживать только ссылку IControlPanel, которая будет раскрывать только данные. Если что-то, кроме Car, может навязать класс ControlPanel, вам может понадобиться какой-то метод фабрики (Create), который возвращает IControlPanel. –

ответ

3

Вы можете сделать это следующим образом:

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 

Он использует закрытый интерфейс, вложенный в Car классе с частным реализованными и псевдонимами членами в ControlPanel. Таким образом, только Car может получить доступ к элементам интерфейса.

+1

Большое спасибо за ваш ответ. –

0

Во-первых, давайте уточним терминологию. То, о чем вы говорите, является «вложенным» классом, а не подклассом

Я не верю, что то, что вы пытаетесь сделать, возможно в .NET. Однако, вам это действительно нужно? Если cp является частным в автомобиле, никто не может увеличивать одометр на панели управления автомобиля. Они могли бы создать свою собственную панель управления, которая не является частью автомобиля, а затем возиться с ним, но в чем вред?

+0

Я сделал ControlPanel Private, но свойство в классе Car делает его доступным. т.е.: (MyCar.ControlPanel.Odometer) –

4

Как Роберт Леви отметил, вы имеете в виду «вложенная класса» и не «Подкласс» и т.д.

А как добиться того, что вы ищете ... вы просто хотите сделать ControlPanel - частный класс? Это гарантирует, что все члены ControlPanel доступны только для автомобилей. Если у вас есть другие участники на ControlPanel, которые должны быть раскрыты, или внешнему внешнему миру необходимо каким-то образом ссылаться на ControlPanel, подумайте об использовании интерфейса, чтобы выставить только те члены, которые вы хотите публично доступным.

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 

Необязательно ...

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

// Other Code... 

Private Class ControlPanel 
    Implements IControlPanel 

// Other Code... 

Какова цель, которую вы пытаетесь достичь с точки зрения API?

+0

Целью, которую я пытаюсь достичь, является модульность. Вместо того, чтобы создавать 100 свойств на уровне Car, я хочу разбить свойства, которые связаны друг с другом в этих «папках». –

0

Сделайте свой ControlPanel приватным и его окрестностями. Класс ControlPanel будет отображаться только на Car, но Car все еще сможет изменять свойства ControlPanel.

+0

Панель управления должна быть общедоступной, как только для чтения вне класса Car. Панель управления должна быть abe для чтения/записи в ControlPanel. –

+0

Значения для одометра и спидометра также являются значениями заполнителя. Эти поля будут связаны с базой данных и будут отображаться по запросу. (то есть: MyCar.ControlPanel.Speedometer) –

0

Вложенные классы - один из способов, или вы можете иметь свой Автомобиль как составной класс. Панель управления может использоваться во многих разных автомобилях (подклассы), поэтому зачем вставлять их в гнездо? У автомобиля есть панель управления. Автомобиль имеет двигатель

Автобус: У автомобиля также есть такие вещи.

Радио может быть чем-то, что имеет панель управления.Спидометр может быть частью панели управления, которая также может быть частью панели управления.

Тогда вы в конечном итоге с

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

Как насчет мотоциклов? Это не автомобиль, но у него все еще есть приборная панель с спидометром.

Получите мое мнение? Композитные объекты.

 Смежные вопросы

  • Нет связанных вопросов^_^