2009-02-25 4 views
1

Me.を非インスタンスメソッドで使用できない場合は、Sharedメソッドで基本クラスのプロパティ/関数をどのように使用しますか?VB.NETとOOP - 共有メソッドと基本プロパティ

例えば、ClassA
ClassBからClassB継承Shared Method DoWork()を有します。 ClassAあなたが静的文脈にしている場合はI ...

Public Sub DoWork() 
    Dim test as String = Me.SecurityKey 
End Sub 

答えて

3

あなたは、 "私を。" を使用することができない場合非インスタンスメソッドでは、Sharedメソッドの基本クラスのプロパティ/関数をどのように使用しますか?

できません。共有メソッド(およびC#のstatic)は、OOPとうまく連携しません。これは、静的/共有メソッドが仮想/上書きできないという事実です。arguablyはJavaから継承された.NETシステムの設計上の欠陥です。共有メソッドは実際にはオブジェクトメソッドではなく、名前スコープを持つグローバルメソッドです。

さらに、問題に関連する場合は、共有されていないメソッド(共有される特定のインスタンスに属しない)にアクセスするためのインスタンスが常に必要です。あなたの例を使用して

+0

残念ながら、私は完全に非OOPの男によって書かれたVB.NETの混乱を修正するのを手伝っています。そして、私は、いくつかのOOPで、混乱を取り除くためにボルトで止めようとしています。私はその人が "Class B"の共有メソッドをASP.NETのObject DataSourcesで使用することを考えていたと思います...どちらも使用していないでしょう – BuddyJoe

+0

しかしねえ...私はきれいにしようとしています誰かが問題を全部書き直すことなく問題になる。人は彼らがビジネスオブジェクトを書いていると思っていました。彼らはもっと "テーブルゲートウェイ"クラスのようなものです。 – BuddyJoe

0

、あなたはそのインスタンスメンバにアクセスするには、このクラスのインスタンスを作成する必要がありますするにはどうすればよいReadOnly Property SecurityKey

を持っています。

2

インスタンス名ではなくクラス名で共有メンバーにアクセスします。IE:ClassA.DoWork()スコープが異なるため、共有メソッド/メンバーからインスタンスメンバーにアクセスすることはできません。ただし、インスタンス識別子を使用せずにインスタンススコープから共有メンバーにアクセスできます。

クラスのインスタンスをメソッドに渡すか、共有メソッドでクラスをインスタンス化してみてください。

Public Shared Sub DoWork(instance As ClassB) 
    Dim test As String = instance.WhateverProperty; 
End Sub 
+0

ClassAで共有されているプロパティをマークすると気付きましたが使用できますが、接頭辞「Me」は使用できません。使用するプレフィックス/キーワードはありますか?私が継承したクラスのためにこれが利用できるいくつかのビジュアルキュー/ヒント? – BuddyJoe

+0

いいえ、クラスエクスプローラを使用して、クラスの異なるメンバーが持つ修飾子を表示できますが、Me/thisのようなインスタンス識別子を持つオブジェクトの共有/静的メンバーにアクセスすることはできません。覚えておくのが最善の方法は、Sharedとマークされている場合です。それは常にClassName.XXXです。 –

1

:それはMe.SecurityKeyプロパティを参照しようとしたときに共有ClassB.DoWork()

どのClassAインスタンスを取得する必要がありますか?

ClassA.SecurityKeyプロパティも共有すると少し意味がありますが、継承関係はもはや重要ではなくなりました。とにかく、そのメソッドの中にClassA.SecurityKeyと言うだけかもしれません。なぜなら、ClassAについて知っていれば、継承されたプロパティを知る必要があるからです。

ClassB.DoWork()を共有メソッドではなくインスタンスメソッドとして使用する場合は、VB.NetのMyBaseキーワードを使用すると、継承されたClassAプロパティをClassBのオーバーロードまたはシャドウしても参照できます。

+0

+1。良い点。そして私はそれが私が考えていたMyBaseのキーワードだと思う。 – BuddyJoe

0
Dim s as SecKey = ClassA.SecurityKey 

これは共有メソッドから引き出されます。共有メソッドはクラスのすべてのインスタンスで共有されるので、クラス名を使用してそれらを取得することを忘れないでください。

関連する問題