Лучше ли использовать свойства в дочернем классе для доступа к родителю или сделать его общедоступным? - PullRequest
3 голосов
/ 20 января 2009

У меня есть 2 класса, родитель и ребенок.


Class Test
    Private Test_Text

    Private Sub Class_Initialize()  
        Test_Text = "Hello"
    End Sub  

    Private Sub Class_Terminate()   

    End Sub 

    Public Property Get Text
        Text = Test_Text
    End Property

    Public Property Let Text(ByVal strIn)
        Test_Text = strIn
    End Property
End Class

Class SubTest
    Public SubTest_Test 
    Private SubTest_Interger

    Private Sub Class_Initialize()  
        Set SubTest_Test = New Test
    End Sub  

    Private Sub Class_Terminate()   
        Set SubTest_Test = Nothing
    End Sub

    Public Property Get int
        int = SubTest_Integer
    End Property

    Public Property Let int(ByVal intIn)
        SubTest_Integer = intIn
    End Property    
End Class

Поскольку я опубликовал SubTest_Test, я могу получить к нему доступ через дочерний класс, как этот


Set MyTest = New SubTest
MsgBox MyTest.SubTest_Test.Text

Допустимо ли это или я должен сделать SubTest_Test закрытым и записать свойства в дочерний класс для доступа к свойствам родителей?

Редактировать: Я предполагаю, что вопрос должен был быть, есть ли какие-либо проблемы безопасности / удобства использования с непосредственным доступом к родителю.
Чем больше я думаю об этом, тем больше я думаю с точки зрения юзабилити, лучше скрывать родителя от любого, кто использует дочерний класс. Таким образом, когда вы создаете объект из дочернего класса, вам не нужно ничего знать о родительском классе.

Ответы [ 3 ]

2 голосов
/ 20 января 2009

Поскольку это отношения между вашими двумя классами HAS-A, я думаю, вы должны оставить все как есть. Вам не нужно вводить инкапсулирующий код для чего-то, что ему не нужно.

Вот пример псевдокода:

class Engine
    [method] start()

class Car
    [property] Engine

В идеале вы хотели бы ссылаться на Engine как свойство Car, например, так:

Car.Engine.start()

Альтернативой может быть написание дополнительного кода в Car для переноса методов в Engine. Хотя вы можете сделать это, это не имеет особого смысла, так как вы будете просто писать сквозные методы от Car до Engine.

1 голос
/ 20 января 2009

нет - это нарушает Закон Деметры ; переосмыслить интерфейс - при каких обстоятельствах кому-то потребуется доступ к свойству Text вложенного объекта Test в объекте SubTest? Если эти ситуации имеют смысл, вам нужно будет представить Text как свойство в SubTest.

Учитывая имена, которые я ожидал бы, чтобы SubTest наследовал от Test и, таким образом, автоматически предоставлял свойство Text, но, к счастью, я забыл VBSCRIPT, поэтому не могу вспомнить, поддерживает ли он даже наследование;

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

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

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