2012-12-23 40 views
5

Hiện nay tôi có mã này cho mô hình cơ bản của tôi:đang liệt kê triển khai loại nằm bên trong hay bên ngoài việc thực hiện Lớp

Public Enum vehicleType 
    Car 
    Lorry 
    Bicycle 
End Enum 
Public Class TrafficSurveyA 
    ' Declare the fields here. 
    Private fCars As Integer 
    Private fBicycles As Integer 
    Private fLorries As Integer 

    Public Sub New() 
     ' An instance of TrafficSurveyA is created with all vehicle counts set to zero. 
     fCars = 0 
     fBicycles = 0 
     fLorries = 0 
    End Sub 
    Public Sub incrementCount(ByVal vehicle As vehicleType) 
     ' Preconditions: none 
     ' Postconditions: If vehicle is "Car", "Bicycle" or "Lorry" then 1 is added 
     ' to the corresponding count. Otherwise nothing is done. 

     Select Case vehicle 
      Case vehicleType.Car : fCars = fCars + 1 
      Case vehicleType.Bicycle : fBicycles = fBicycles + 1 
      Case vehicleType.Lorry : fLorries = fLorries + 1 
      Case Else 'do nothing 
     End Select 
    End Sub 

    Public Function getCount(ByVal vehicle As vehicleType) As String 
     ' Preconditions: none 
     ' Postconditions: If vehicle is "Car", "Bicycle" or "Lorry", the string 
     ' representation of the corresponding count is returned. 
     ' Otherwise the empty string is returned. 

     Dim result As String 
     result = "" 
     Select Case vehicle 
      Case vehicleType.Car : result = Convert.ToString(fCars) 
      Case vehicleType.Bicycle : result = Convert.ToString(fBicycles) 
      Case vehicleType.Lorry : result = Convert.ToString(fLorries) 
      Case Else : result = "" 
     End Select 
     Return result 
    End Function 

    Public ReadOnly Property Vehicles() As String 
     ' Preconditions: none 
     ' Postconditions: The total number of vehicles recorded is returned. 
     Get 
      Return (fCars + fBicycles + fLorries).ToString() 
     End Get 
    End Property 
End Class 

Dường như Enum có thể chỉ là một cách dễ dàng được đặt trong lớp TrafficSurveyA như vậy .. .

Public Class TrafficSurveyA 

    Enum vehicleType 
     Car 
     Lorry 
     Bicycle 
    End Enum 

    ' Declare the fields here. 
    Private fCars As Integer 
    Private fBicycles As Integer 
    Private fLorries As Integer 

    Public Sub New() 
     ' An instance of TrafficSurveyA is created with all vehicle counts set to zero. 
     fCars = 0 
     fBicycles = 0 
     fLorries = 0 
    End Sub 
    ... 
    ... 

sự khác biệt chỉ sau đó có vẻ là trong mã GUI tôi cần phải sử dụng TrafficSurveyA.vehicleType.Lorry này chứ không phải là vehicleType.Lorry này.

Cả hai dường như chạy ok nhưng là một trong những triển khai của loại enum sai?

Trả lời

4

Không, cả hai đều ổn. Nó chỉ là một vấn đề ưu tiên và những gì làm cho ý nghĩa nhất cho mục đích tổ chức. Đề nghị duy nhất tôi có là nếu enum sẽ được sử dụng như là một loại đầu vào hoặc đầu ra trong bất kỳ lớp nào khác, tôi sẽ không đặt nó bên trong lớp này. Điều đó sẽ chỉ gây nhầm lẫn.

+0

+1 cổ vũ Steven. Tôi có một câu hỏi 'enum' đơn giản khác [TẠI ĐÂY] (http://stackoverflow.com/questions/14013227/converting-enum-type-to-a-sting-in-order-to-return-the-name) . – whytheq

0

Cũng nghĩ về giới hạn phạm vi đến phạm vi hẹp nhất:

  • cá nhân chỉ được sử dụng bên trong một lớp
  • bạn bè sử dụng bên trong lắp ráp
  • Công có thể được truy cập vào bất kỳ dự án, lắp ráp xây dựng từ này dự án

Scope

1

Không ai trong số t tùy chọn của anh ta sai, nhưng các kiểu lồng nhau công khai (như enum được khai báo bên trong lớp) thường không được khuyến khích. Họ có thể gây nhầm lẫn cho khách hàng phải hội đủ điều kiện họ với tên lớp bên ngoài. Xem các nguyên tắc có liên quan here. Một số có liên quan:

Không sử dụng các loại lồng nhau công khai làm cấu trúc nhóm logic; sử dụng không gian tên cho việc này.

Tránh loại lồng nhau được hiển thị công khai. Ngoại lệ duy nhất cho điều này là khi các biến của kiểu lồng nhau cần được khai báo trong các trường hợp hiếm hoi như phân lớp con hoặc các kịch bản tùy chỉnh nâng cao khác.

Không sử dụng các loại lồng nhau nếu loại có thể được tham chiếu bên ngoài loại khai báo.

+0

ahhh - vì vậy một _Class_ có hiệu quả là _type_ + một _enum_ cũng là một _type_. Vì vậy, khi tôi đặt 'enum' bên trong' Lớp 'tôi thực sự là _nesting types_; Tôi sẽ tránh điều này trong tương lai. – whytheq

+0

@whytheq: lưu ý rằng đây là _guideline_, có thể có lý do chính đáng để sử dụng các loại lồng nhau. –

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