2016-11-25 9 views
0

私は2つのクラス、ノートとHeldNoteを持っています。 HeldNoteはNoteから継承し、2つの変数だけでなく視覚的な次元を設定する別の方法を追加します。定義されていない量の配列があり、それぞれの項目はクラスノートのメンバーとして定義されています。変数のクラスをプログラムで再定義するにはどうすればよいですか?

ときどき私のプログラムでは、配列内のこれらの項目の1つをノートではなくHeldNoteにしたいと思います。プログラムが実行されるまでは、どの項目がHeldNoteであるかわかりません。

VB.Netは配列(i)=新しいHeldNoteを宣言してもうまくいくようですが、HeldNoteには変数にアクセスできませんが、メモはありません。プログラムでブレークを使用すると、array(i)が実際にノートではなくHeldNoteとして再定義されているとは考えられません。

私の質問は、私は配列(i)ノートではなくHeldNoteをどうやって作るのですか?私はVB.net 2008

Editを使用してい

:私はこの問題についての私の教師を頼み、彼は知らなかったと述べて、それをルックアップするために私に言いました。私はオンラインで何もできませんでした(私は彼に尋ねる前から見ていたので)私はここで助けに来ました。

+0

なぜVB2008を使用していますか? – Dai

+0

それは学校のプロジェクトで、何らかの理由で私の学校は私たちが使っているものを決めました。 – Hado

+0

これは、継承よりも集計を選択する理由です。 'Note'クラスと' NoteVisualProperties'クラスが1つしかないとしましょう。継承する代わりに、 'Note'クラスは' NoteVisualProperties'の一つのインスタンスを持っています。 「通常」の注記がある場合、このインスタンスはnullまたはデフォルト値で定義されます。 "HeldNote"の場合は、プロパティオブジェクトを介して余分な変数とディメンションを設定します。 –

答えて

1

後者から派生するので注意の配列は、(あなたのサイズについて不明な点がある場合は、より良い(注)のリストを使用)注とHeldNoteの両方を保存することができます最初。

しかし、あなたはそれが自動的にノートに変換されていない配列にHeldNoteを保存するとき、それはあなたが必要なものをまだHeldNote、あるは、例えばHeldNote

に戻ってそれをキャストしようとすることです

Sub Main 

    Dim X(2) As Note 

    X(0) = New Note() WIth {.Note = "A Message"} 
    X(1) = New HeldNote() With {.Note = "Held Message", .Author = "Steve"} 


    Dim h As HeldNote 

    h = TryCast(X(0), HeldNote) 
    If h Is Nothing Then 
     Console.WriteLine("X(0) is NOT an HeldNote") 
    Else 
     Console.WriteLine(h.Author) 
    End If 

    h = TryCast(X(1), HeldNote) 
    If h Is Nothing Then 
     Console.WriteLine("X(1) is NOT an HeldNote") 
    Else 
     Console.WriteLine(h.Author) 
    End If 
End Sub 

Public Class Note 
    Public Note As String 
End Class 

Public Class HeldNote 
    Inherits Note 
    Public Author As String 
End Class 

このように、特定のNote配列(オブジェクト配列には何も格納することはできません)で許可されている厳密な型指定が緩んでいるため、オブジェクト配列を使用しないでHeldNoteを使用できます。ボタンや文字列で違いはありません)

+0

ありがとう、これは理にかなっており、すべてをObjectとして宣言するよりも良い解決策のように思えます。 – Hado

1

いくつかの提案:

1)あなたのデザインを変更し、ただ一つのクラスではなく、他から継承するものを持っています。

2)配列をオブジェクト型として宣言します。 Object配列の各要素は異なる型にすることができます。この方法で、各要素のタイプを実行時に割り当てることができます。

Dim notearray As Object() = New Object() {New Note(), New HeldNote(), New HeldNote(), New Note()} 
+0

オプション2は実際には完璧に聞こえます。ありがとうございます。 (これは、クラス継承を使用しているため、オプション1を使用したい) – Hado

+2

申し訳ありませんが、Object型の配列を宣言するのは、ドイツのオートバンで20 mp/hのフェラーリを運転するようなものです。あなたはCompleleyがPolymprphism、Aggregation、Inheritance、そしてGenericsの本当に強大なコンセプトのようなオブジェクト指向のコンセプトの力を欠いている... –

+1

もし私があなたの先生だったら、Object配列を使って、あなたに高い得点を与えることはできません... Objectアレイそれはメアリーポピンズのバッグのようなものです – Caveman

1

これはコードの問題ではなく、ほぼOOの質問です。

"私は、項目の定義されていない量の配列を持ち、各項目はクラスノートのメンバーとして定義されています。"

これらのすべてが「注」です。

Note theNote = new HeldNote() 

ていますが、実行上のインスタンスはそう宣言した「ダウングレード」することはできません:あなたはとてもクラスのインスタンスを作成することができます

Note theNote = new Note()". 

あなたが「ランダム」タイプの変更が必要な場合は、あなたが作成することができますListOf(HeldNote)。 その後、あなたはとても本当のタイプを決めることができます。

Dim aList as new ListOf(HeldNote) 
aList.add(new HeldNote()) 
aList.add(new HeldNote()) 
aList.add(new HeldNote()) 

Dim oNote as Note 
oNote = Ctype(aList(0),Note) 

Dim oNote as HeldNote 
oNote = aList(1) 
... 
+1

List(Of HeldNote).... – Steve

関連する問題