在另一个 Class 中声明一个 Class 的目的是什么?
What is the purpose of declaring a Class within another Class?
我来自 VBA 世界,在这个世界中,将代码分解为 classes、名称空间和模块的选项是有限的。现在我刚刚来到一个有很多选择的世界,我感到迷茫。
我想知道在另一个 Class 中声明一个 Class 的目的是什么? (见下面的例子)
Class FirstClass
Public OnePropertyInside As String
Class SecondClass
Public AnotherProperty As String
End Class
End Class
如果我创建 FirstClass
的新实例(例如 myFirstClass
),SecondClass
不会被实例化。
更奇怪的是(至少对我来说),intelissense 为我提供了 myFirstClass.SecondClass
。显然,因为 class 没有实例化,我无法访问它的任何成员。
那么,只有当 SecondClass
包含 shared
成员时才有用吗?
为了尝试回答这个问题,我在 SecondClass
:
中添加了一个共享成员
Class FirstClass
Public OnePropertyInside As String
Class SecondClass
Public AnotherProperty As String
Public Shared SharedProperty As String
End Class
End Class
我运行一些测试带来了次要问题(见代码中的评论)
Sub Main()
Dim myFirstClass As New FirstClass
'Works as expected
Console.WriteLine(myFirstClass.OneProperty)
'What is the difference between the two lines below?
Console.WriteLine(myFirstClass.SecondClass.SharedProperty)
Console.WriteLine(FirstClass.SecondClass.SharedProperty)
'This line cannot be compiled, this demonstrates SecondClass is not instantiated when FirstClass is.
Console.WriteLine(myFirstClass.SecondClass.AnotherProperty)
Dim mySecondClass As New FirstClass.SecondClass
'Works as expected, but I feel this hierarchy should better be dealt with through a namespace statement?
Console.WriteLine(mySecondClass.AnotherProperty)
End Sub
你通常这样做是因为你想限制嵌套的范围class。
因此,如果您只需要在 "parent" class 中使用此 class(就范围而言),那么通常最好将其定义为嵌套 class。
如果您可能需要在其程序集之外使用 class,那么最好将其定义为一个完全独立的 class(在其自己的文件中),然后定义您的相应的关系。您将需要在另一个中实例化一个(无论是单独的还是嵌套的,这都是一样的 - 所以它的位置在很大程度上与该点无关)。
你可以把它想象成最里面的 class 是某种帮助者 class。它甚至可能根本不需要使用。将内部 class(或简单地嵌套 class)嵌套在外部 class 中可以让您访问外部的所有成员。您甚至可以访问初始外部 class.
内的私有成员
编辑:为了澄清,我的意思是说内部可以访问外部的私有成员,而不是相反。
当您这样做时,内部 class 可供其他 class 访问(其可访问性为 Public
或 Friend
),外部 class 基本上就像一个命名空间。因此,例如,使用您的示例,您可以创建嵌套 class 的新对象,而无需创建外部 class:
Dim x As New FirstClass.SecondClass()
最明显的好处是代码的结构组织,很像命名空间和代码文件。因此,例如,对常量使用嵌套 classes 并不少见,以帮助更好地组织它们:
Public Class Urls
Public Class Processing
Public Const Submit As String = "..."
Public Const Cancel As String = "..."
End Class
Public Class Reporting
Public Const Daily As String = "..."
Public Const Weekly As String = "..."
End Class
End Class
' ...
Dim url As String = Urls.Reporting.Daily
但是,除了像这样的东西有用的少数情况之外,大多数人宁愿根本不嵌套 public classes。
但是,正如其他人所提到的,您真正会经常看到嵌套 classes 的地方是 Private
。如果您需要一些小帮手 class,它对您的 class 之外的代码毫无用处,则没有理由公开它。即使您将它的可访问性设置为 Friend
,它仍然对同一项目中的所有其他 class 可见。因此,如果您真的想将它从其他所有内容中隐藏起来,您需要将其设为嵌套私有 class。例如:
Public Class MyClass
Public Function GetTheIdOfSomething() As Integer
Dim d As Details = GetDetailsAboutSomething()
If d.Value Is Nothing Then
Return d.Id
Else
Throw New Exception()
End If
End Sub
Private Function GetDetailsAboutSomething() As Details
' ... return a Details object
End Function
Private Class Details
Public Property Id As Integer
Public Property Value As String
End Class
End Class
我来自 VBA 世界,在这个世界中,将代码分解为 classes、名称空间和模块的选项是有限的。现在我刚刚来到一个有很多选择的世界,我感到迷茫。
我想知道在另一个 Class 中声明一个 Class 的目的是什么? (见下面的例子)
Class FirstClass
Public OnePropertyInside As String
Class SecondClass
Public AnotherProperty As String
End Class
End Class
如果我创建 FirstClass
的新实例(例如 myFirstClass
),SecondClass
不会被实例化。
更奇怪的是(至少对我来说),intelissense 为我提供了 myFirstClass.SecondClass
。显然,因为 class 没有实例化,我无法访问它的任何成员。
那么,只有当 SecondClass
包含 shared
成员时才有用吗?
为了尝试回答这个问题,我在 SecondClass
:
Class FirstClass
Public OnePropertyInside As String
Class SecondClass
Public AnotherProperty As String
Public Shared SharedProperty As String
End Class
End Class
我运行一些测试带来了次要问题(见代码中的评论)
Sub Main()
Dim myFirstClass As New FirstClass
'Works as expected
Console.WriteLine(myFirstClass.OneProperty)
'What is the difference between the two lines below?
Console.WriteLine(myFirstClass.SecondClass.SharedProperty)
Console.WriteLine(FirstClass.SecondClass.SharedProperty)
'This line cannot be compiled, this demonstrates SecondClass is not instantiated when FirstClass is.
Console.WriteLine(myFirstClass.SecondClass.AnotherProperty)
Dim mySecondClass As New FirstClass.SecondClass
'Works as expected, but I feel this hierarchy should better be dealt with through a namespace statement?
Console.WriteLine(mySecondClass.AnotherProperty)
End Sub
你通常这样做是因为你想限制嵌套的范围class。
因此,如果您只需要在 "parent" class 中使用此 class(就范围而言),那么通常最好将其定义为嵌套 class。
如果您可能需要在其程序集之外使用 class,那么最好将其定义为一个完全独立的 class(在其自己的文件中),然后定义您的相应的关系。您将需要在另一个中实例化一个(无论是单独的还是嵌套的,这都是一样的 - 所以它的位置在很大程度上与该点无关)。
你可以把它想象成最里面的 class 是某种帮助者 class。它甚至可能根本不需要使用。将内部 class(或简单地嵌套 class)嵌套在外部 class 中可以让您访问外部的所有成员。您甚至可以访问初始外部 class.
内的私有成员编辑:为了澄清,我的意思是说内部可以访问外部的私有成员,而不是相反。
当您这样做时,内部 class 可供其他 class 访问(其可访问性为 Public
或 Friend
),外部 class 基本上就像一个命名空间。因此,例如,使用您的示例,您可以创建嵌套 class 的新对象,而无需创建外部 class:
Dim x As New FirstClass.SecondClass()
最明显的好处是代码的结构组织,很像命名空间和代码文件。因此,例如,对常量使用嵌套 classes 并不少见,以帮助更好地组织它们:
Public Class Urls
Public Class Processing
Public Const Submit As String = "..."
Public Const Cancel As String = "..."
End Class
Public Class Reporting
Public Const Daily As String = "..."
Public Const Weekly As String = "..."
End Class
End Class
' ...
Dim url As String = Urls.Reporting.Daily
但是,除了像这样的东西有用的少数情况之外,大多数人宁愿根本不嵌套 public classes。
但是,正如其他人所提到的,您真正会经常看到嵌套 classes 的地方是 Private
。如果您需要一些小帮手 class,它对您的 class 之外的代码毫无用处,则没有理由公开它。即使您将它的可访问性设置为 Friend
,它仍然对同一项目中的所有其他 class 可见。因此,如果您真的想将它从其他所有内容中隐藏起来,您需要将其设为嵌套私有 class。例如:
Public Class MyClass
Public Function GetTheIdOfSomething() As Integer
Dim d As Details = GetDetailsAboutSomething()
If d.Value Is Nothing Then
Return d.Id
Else
Throw New Exception()
End If
End Sub
Private Function GetDetailsAboutSomething() As Details
' ... return a Details object
End Function
Private Class Details
Public Property Id As Integer
Public Property Value As String
End Class
End Class