Visual Basicでオブジェクトをその親オブジェクトにキャストできません

vb.net
Visual Basicでオブジェクトをその親オブジェクトにキャストできません

C#では、次のようなことができます。

`Honda a = new Car();`そしてそれは機能しますが、同じものはVisual Basic.NETでは機能しません(私はVisual Basicにはかなり新しいです)

「Honda = new Carとして暗くする」と、「SampleApp.Car」タイプのオブジェクトを「SampleApp.Honda」タイプにキャストできないというメッセージが表示されます。

ここはどうしたの?

これが私のサンプルコードです。

Module Module1

    Sub Main()
        Dim a As B = New A
        Console.WriteLine(a.DoSOmething())
        Console.ReadLine()
    End Sub
End Module

Class A
    Public Overridable Function DoSOmething() As String
        Return "SOmething"
    End Function
End Class

Class B
    Inherits A

    Public Overrides Function DoSOmething() As String
        Return "Something else"
    End Function

End Class

  1  0


ベストアンサー

ホンダは車よりも具体的であり、追加の機能や動作が含まれる場合があります。 ホンダを問題なく車にキャストできますが、車をホンダにキャストすることはできません。

編集:たとえば、ホンダにはActivateVTECメソッドが含まれる場合がありますが、すべての車にはRefuelメソッドがあるため、Honda = new Carを作成できた場合、ActivateVTECは未定義になります。

5


これは間違っています。 AをBとしてキャストすることはできません。

これは有効なステートメントです。

 Dim instance as A = New B

`A`にはBのインスタンスを含めることができますが、その逆はできません。

4


クラスが「Honda」と「Car」に言及しているので、あなたの例は少し混ざっていますが、コードにはクラス「A」と「B」があります。 私はあなたのC#コードで推測しています

class Honda : Car {  }

その場合

Honda a = new Car(); // Cannot implicitly convert type 'Car' to 'Honda'

タイプ「Car」のオブジェクトをタイプ「Honda」の参照に割り当てようとしています。 class Honda:Car {}`があると仮定すると、親型 `Car`のオブジェクトを子型 Honda`の参照に割り当てようとしています。 あなたの質問は「オブジェクトをその*親*オブジェクトにキャストできません」と言っていますが、実際には、あなたが提供したコードと仮定に基づいて反対のことをしようとしています。 +したがって、C#でも、「型 ‘Car’を ‘Honda’に暗黙的に変換することはできません」というコンパイラエラーが発生するはずです。 あなたが言うように動作しないはずです。

これは、VBとC#(およびJavaなどの他のオブジェクト指向言語)に同様に適用される継承の仕組みによるものです。

この例の「Honda」と「B」は、クラス階層で「Car」と「A」の下位にあります。 つまり、少なくとも基本クラス(別名スーパークラスまたは親クラス)のすべてのプロパティがあります。 そのため、コンパイラは、基本クラスをより特化したクラスに暗黙的に変換することはできませんが、より特化したクラスを基本クラスに暗黙的に変換することはできます。 そのため、タイプ「Car」のオブジェクトをタイプ「Honda」の変数に割り当てると、明示的なタイプ変換がない場合にコンパイラーエラーが発生します。 ただし、「Honda」型のオブジェクトを「Car」型の変数に、または「B」型のオブジェクトを「A」型の変数に割り当てることはできます。

Dim myHonda as Car = New Honda()
Dim bObject as A = New B()

またはC#で

Car myHonda = new Honda();
A bObject = new B();

0


タイトルとURLをコピーしました