Вложенный класс Access-методы для свойств в .NET - PullRequest
8 голосов
/ 20 января 2011

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

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

(то есть: не в сборке или пространстве имен и не в приложении, в котором будет использоваться библиотека классов) ... Я изменил свойства доступа к классу на Friend, Protected Friend, Private, Public, но на любую комбинацию. не соответствует моим ожидаемым результатам.

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

Есть мысли?

 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

Ответы [ 5 ]

4 голосов
/ 20 января 2011

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

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

По желанию ...

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

// Other Code...

Private Class ControlPanel
  Implements IControlPanel

// Other Code...

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

3 голосов
/ 20 января 2011

Вы можете сделать это так:

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 может получить доступ к элементам интерфейса.

0 голосов
/ 20 января 2011

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

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

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

Тогда вы получите

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

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

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

0 голосов
/ 20 января 2011

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

0 голосов
/ 20 января 2011

Для начала уточним терминологию. Здесь вы говорите о «вложенном» классе, а не о подклассе

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...