2009-04-15 5 views
0

で別のOOPの質問今、私は次のことを願っていますが可能です...私はそれはので、ここで行く完全かどうか分からないが、Asp.net

以下

は私が望んでいるものの設定が可能です(VB.netで、C#でお答えすること自由に感じ、私はそれをうまくすることができるはずです):

Public Class A 

    Private _name As String 
    Private _s As SearchA 

    Public Property Name() As String 
     Get 
      Return _name 
     End Get 
     Set(ByVal Value As String) 
      _name = Value 
     End Set 
    End Property 
    Public Property S() As SearchA 
     Get 
      Return _s 
     End Get 
     Set(ByVal Value As SearchA) 
      _s = Value 
     End Set 
    End Property 

    Public Sub New(ByVal name As String) 
     _name = name 
     _s = New SearchA() 
    End Sub 

    Public Function GetSearch() As String 
     Return _s.Search 
    End Sub 

End Class 

Public Class SearchA 

    Private _search As String 

    Public Property Search() As String 
     Get 
      Return _search 
     End Get 
     Set(ByVal Value As String 
      _search = Value 
     End Set 
    End Property 

    Public Sub New() 
     _search = "Search using Base" 
    End Sub 
End Class 

Public Class B 
    Inherits A 

    Private Shadows _s As SearchB 

    Public Shadows Property S() As SearchB 
     Get 
      Return _s 
     End Get 
     Set(ByVal Value As SearchB) 
      _s = Value 
     End Set 
    End Property 

    Public Sub New(ByVal name As String) 
     Mybase.New(name) 
     _s = New SearchB() 
    End Sub 

End Class 

し、最終的に

Public Class SearchB 
    Inherits SearchA 

    Private _superSearch As String 

    Public Property SuperSearch () As String 
     Get 
      Return _superSearch 
     End Get 
     Set(ByVal Value As String 
      _superSearch = Value 
     End Set 
    End Property 

    Public Sub New() 
     Mybase.New() 
     _search = "Search using New" 
     _superSearch = "With more options..." 
    End Sub 

End Class 

、ここでは、使用です:

Dim oB As New B("hello") 
Response.Write(oB.GetSearch()) 

任意のアイデア、私は影がうまくいくかもしれないと思ったし、印刷は「新しいを使用して検索する」が、それはしないのですか?プロパティーには基本クラスのプロパティとは異なる戻り型があるため、オーバーライドできません。 基本クラス内に、各子クラス内でオーバーライドするための を持たないコア関数のセットを定義します。それともこれはあまり意味がないのでしょうか?

ありがとうございました!

スティーブは

+0

EDIT物事を置くために:クラスBのSプロパティで設定が –

+0

@stibstibstib「SEARCHBとしての価値」を言う必要があります:あなたは、あなたの質問を編集することができます。これらのコメントのすぐ上に少し "編集"リンクがあります。 – Welbog

+0

ああ、それはかなり小さいですね。私は今、それを使用します、ありがとう。 –

答えて

0

は、私はあなたがSearchAとSEARCHBによって継承された抽象検索クラスを定義されて何をしたいかと思います。 _Sを保護された検索タイプにして、パブリックプロパティとして公開し、SearchAをAクラスに、SearchBをBクラスに割り当てます。次にGetSearch()はAからSearchAを返し、BからSearchAを返します。検索として

+0

ありがとうJamie、私は残念なことに私の場合、私が無用にしようとしていたことの原則をレンダリングする唯一の選択肢だと思いました。 –

+0

何をしようとしていますか?この質問からは明らかではなかった。もしあなたがそれを言い換えると、より良い/より良い応答を得るかもしれません。 –

0

は私がGetSearchがAに実装されているので、それはあると思うので、あなたは、レガシーコードで、あなたは間違って何をしているかを自問すべきではない影を使用する場合には、一般的に

A.

からフィールドを使用しています。

ここにあるように、このデザインには匂いがあります。 Aからの継承BとSearchAからのSearchBの両方のケースは、誤った継承のようなものです。それは "ほとんど同じ"ので、犬から猫を継承するようなものです。 Jamie氏は既に言っているように、抽象基本クラスを使うべきです。

  • 抽象基底クラスを使用してAとB
  • 基底クラスによって 参照でSearchAとSEARCHBによって実装されるインターフェースインクリメンタルサーチを使用する継承:

    はと考えています。それは古典的な戦略パターンです。

  • SearchAまたはSearchBへの型付き参照が必要な場合は、ジェネリックを使用してください。おそらく は必要ありません。
  • 使用工場が一緒に
関連する問題