3

以下のコードを見てください。

    Public Class A
    Public person1 As Person
End Class

Public Class B
    Inherits A

    Public Function CheckGender() As Boolean
        If person1._Gender = "M" Then
            CheckGender = True
        End If
    End Function

End Class

Public Class C
    Inherits B
    Public Function CheckAge() As Boolean
        If person1._Age > 30 Then
            CheckAge = True
        End If
    End Function

End Class

Public Class D
    Inherits C

    Public Sub SomeMethod()
        Dim list As List(Of Person) = New List(Of Person)
        Dim p1 As New Person("Ian", "M", 31)
        Dim p2 As New Person("Susan", "F", 20)
        Dim p3 As New Person("Mark", "M", 22)
        list.Add(p1)
        list.Add(p2)
        list.Add(p3)

        For Each Person As Person In list
            person1 = Person
            If CheckAge() And CheckGender() Then
                'Do something
            End If
        Next
    End Sub

    Public Shared Sub Main()
        Dim d As New D
        d.SomeMethod()
    End Sub

End Class

Public Class Person
    Public _Name As String
    Public _Gender As String
    Public _Age As String
    Public Sub New(ByVal Name As String, ByVal Gender As String, ByVal Age As Integer)
        _Name = Name
        _Gender = Gender
        _Age = Age
    End Sub
End Class

c.SomeMethodは 3 人をループし、次の 2 つのチェックを行います:b.CheckGenderc.CheckAge. スーパークラスのインスタンス変数CheckGenderを使用します。 CheckAgeA

CheckGenderライブ環境のコードは、データベース内の毎日 100,000 レコードをループし、とCheckAgeが両方とも true であるレコードを削除します。このシナリオでインスタンス変数を使用するのは設計上の選択として不適切ですか? 私は常にローカル変数を使用するように教えられました。オブジェクトが各ループにPerson渡されることを期待しています。それとも本当に関係ないですか?CheckGenderCheckAge

上記のコードは架空の例であることに注意してください。 CheckGender実際のアプリケーションでCheckAgeは複雑な機能です。

4

2 に答える 2

2

Person をフィールドではなくプロパティにするようにコードを「修正」することに関心がある場合は、クラス A の実装を次のように変更します。

Public Class A
    Public Property Person1 As Person

   Public Overridable Function ComputeAge() As Integer
       Return Person1.Age
   End Function

End Class

ここでの利点は、必要に応じて、このプロパティを取得して設定するよりも抽象化を追加できることです。コンパイラは、auto プロパティの隠しプライベート バッキング フィールドを生成します。実装クラスから Person1 に引き続きアクセスします。

Public Class B
   Inherits A

   Public Overrides Function ComputeAge() As Integer
       Return MyBase.Person1.Age.AddYears(1)
   End Function
End Class
于 2013-04-03T21:03:11.163 に答える