none
多層 Class 的問題 RRS feed

  • 問題

  • Public MustInherit Class FootSlab
        Public MustOverride ReadOnly Property Moment()
    End Class

    Public Class GroupPile

        Private _m As Integer = 1

        Public Property m() As Integer
            Get
                m = _m
            End Get
            Set(ByVal value As Integer)
                _m = value
            End Set
        End Property

        Class Cap
            Inherits FootSlab

            Public Overrides ReadOnly Property Moment()
                Get
                    Moment = m + 1 <----------- m無法參考

                End Get
            End Property

    End Class

    有兩個問題

    (1)上面標示的 m 無法參考, 要怎麼修正呢?

    (2)若我 Dim obj As New GroupPile , 有沒有辦法 取用 obj.Cap.Moment 呢?

    • 已移動 a-talinModerator 2011年4月22日 上午 02:24 VB 語法討論 (從:ASP.NET 與 AJAX(ASP.NET and AJAX))
    2011年4月21日 下午 06:33

解答

  • (1)

    m 不是靜態成員, 必須要產生 GroupPile 類別的執行個體才可以存取該執行個體的 m 屬性

    意思就是說, 當你寫 Moment=m+1 時 m根本不存在.

    照你的寫法可能需要將 _m 與 m 設為 靜態

    ex:

    Private Shared _m As Integer = 1

        Public Shared Property m() As Integer
            Get
                m = _m
            End Get
            Set(ByVal value As Integer)
                _m = value
            End Set
        End Property

    (2) 在 GroupPile 建立一個屬性其型別為 Cap 並產生執行個體

    Public MustInherit Class FootSlab
        Public MustOverride ReadOnly Property Moment()
    End Class

    Public Class GroupPile

        Private Shared _m As Integer = 1

        Public Shared Property m() As Integer
            Get
                m = _m
            End Get
            Set(ByVal value As Integer)
                _m = value
            End Set
        End Property

        Private _inCap As New Cap
        Public Property inCap As Cap
            Get
                Return _inCap
            End Get
            Set(ByVal value As Cap)
                _inCap = value
            End Set
        End Property

        Class Cap
            Inherits FootSlab

            Public Overrides ReadOnly Property Moment()
                Get
                    Moment = m + 1

                End Get
            End Property

        End Class
    End Class

    (3) 你的OO觀念有點混亂, 建議你先將物件導向程式設計的原理搞清楚, 可以參考 [物件導向程式設計 (C# 與 Visual Basic)]

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已提議為解答 阿尼 2011年4月22日 上午 12:50
    • 已標示為解答 Fish3883 2011年4月22日 上午 06:32
    2011年4月21日 下午 07:46
    版主

所有回覆

  • (1)

    m 不是靜態成員, 必須要產生 GroupPile 類別的執行個體才可以存取該執行個體的 m 屬性

    意思就是說, 當你寫 Moment=m+1 時 m根本不存在.

    照你的寫法可能需要將 _m 與 m 設為 靜態

    ex:

    Private Shared _m As Integer = 1

        Public Shared Property m() As Integer
            Get
                m = _m
            End Get
            Set(ByVal value As Integer)
                _m = value
            End Set
        End Property

    (2) 在 GroupPile 建立一個屬性其型別為 Cap 並產生執行個體

    Public MustInherit Class FootSlab
        Public MustOverride ReadOnly Property Moment()
    End Class

    Public Class GroupPile

        Private Shared _m As Integer = 1

        Public Shared Property m() As Integer
            Get
                m = _m
            End Get
            Set(ByVal value As Integer)
                _m = value
            End Set
        End Property

        Private _inCap As New Cap
        Public Property inCap As Cap
            Get
                Return _inCap
            End Get
            Set(ByVal value As Cap)
                _inCap = value
            End Set
        End Property

        Class Cap
            Inherits FootSlab

            Public Overrides ReadOnly Property Moment()
                Get
                    Moment = m + 1

                End Get
            End Property

        End Class
    End Class

    (3) 你的OO觀念有點混亂, 建議你先將物件導向程式設計的原理搞清楚, 可以參考 [物件導向程式設計 (C# 與 Visual Basic)]

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已提議為解答 阿尼 2011年4月22日 上午 12:50
    • 已標示為解答 Fish3883 2011年4月22日 上午 06:32
    2011年4月21日 下午 07:46
    版主
  • 謝謝  Bill Chung 大

    第 (1)個問題

    已依建議

    Private _inCap As New Cap
    Public Property inCap As Cap
    End Property

    修正, 可以決解我現有問題

    看來我的觀念還要好好加強

    不過我在使用時會有

    obj.inCap.Moment 及 obj.Cap可以選

    若我只想要出現obj.inCap就好

    不知可以怎麼修正?

     

     

    第 (2)個問題中

    用 Shared 可以解決現有問題

    但我的 GroupPile 希望是可以多次產生的非靜態的形式

    是否我該改變我現有的寫法?

     

    (3)我會好好再詳讀相關OO觀念的, 十分感謝

    2011年4月22日 上午 01:02
  • (1)如果您是在C#3.0 或 VB 10.0,寫法可以更簡潔,這個你在上一個發問已經問過了

    請參考: 

    1. http://social.msdn.microsoft.com/Forums/zh-TW/236/thread/1788c873-7013-4a85-85b9-2896de595672#801f455c-a310-4030-abc6-4f51db014e8e
    2. http://www.dotblogs.com.tw/larrynung/archive/2009/08/11/9988.aspx

    而且,visibility的封裝,通常是針對外部存取這個object。而不是連自己class內部都看不到,如果連內部都看不到,那不就根本不用宣告嗎?

    by the way, 因為property宣告在以前都得用您現在的方式,有點麻煩,所以後面的C#和VB.NET版本才會修正的更簡潔

     


    常用資源參考:
    小弟的blog: In 91,wiki: my wiki
    2011年4月22日 上午 01:28