none
mustinheritで宣言されたクラスでは RRS feed

  • 質問

  • Public Class Form1

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

            Dim obj(2) As SuperClass
            obj(0) = New SubClassA
            obj(1) = New SubClassB
            obj(2) = New subClassC

            For i As Integer = 0 To UBound(obj)
                obj(i).disp()

            Next
        End Sub
    End Class

    上記のコードで「NEW SubClassA」の所に青い波線がついて、mustinheritで宣言されたクラスではNEWは使えませんと出ます。何が原因でしょうか。

    galacoさんの答えの通りですがMstinheritを消すと、

    Public Class SubClassC
        Inherits SuperClass
        Public Overridable Sub disp()
            MessageBox.Show("商品名はGOODSです。")
        End Sub
    End Class

    「SubClassC」に青い波線でPublic mustoverride sub methodC()の継承'MustOverride'メンバーをオーバーライドしなければいけませんと出ます。どの様にしたらオーバーライドできますか。

    2014年5月11日 18:14

回答

  • 継承にかかわる修飾子の理解が不足しているようなので、リンク先を読んでみてください。

    • MustInherit
      継承しなければならないクラス。不完全なクラスとも言えます。
      不完全なクラスであるためインスタンスをつくることはできません。
      完全なクラスにするには継承が必須です。
    • Overridable
      継承したクラスで上書き可能であるという宣言。
    • Overrides
      継承したクラスで上書きをするという宣言。


    提示されているコードでは、SubClassA,B,CにもMustInheritがついているために継承が必要なクラスになっています。
    インスタンス化(New)するにはMultInheritがついていてはいけません。

    Overridableは基底クラス(SuperClass)で1度宣言すれば十分です。
    継承したクラスではOverridesで上書きします。

    Public MustInherit Class SuperClass Public Overridable Sub Disp() MessageBox.Show("商品名は登録されていません") End Sub End Class Public Class SubClassA 'MustInheritをつけたらインスタンスを作れない(Newできない) Inherits SuperClass Public Overrides Sub Disp() 'OverridableではなくOverrides MessageBox.Show("商品名は******です。") End Sub End Class Public Class SubClassB 'MustInheritをつけたらインスタンスを作れない(Newできない) Inherits SuperClass Public Overrides Sub Disp() 'OverridableではなくOverrides MessageBox.Show("商品名はMANUFACTURです。") End Sub End Class Public Class SubClassC 'MustInheritをつけたらインスタンスを作れない(Newできない) Inherits SuperClass Public Overrides Sub Disp() 'OverridableではなくOverrides MessageBox.Show("商品名はGOODSです。") End Sub End Class Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim obj(2) As SuperClass obj(0) = New SubClassA obj(1) = New SubClassB obj(2) = New SubClassC For i As Integer = 0 To UBound(obj) obj(i).Disp() Next End Sub End Class

    #SubClassAの実装は提示されていないので適当

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2014年5月13日 17:46
    • 回答としてマーク bentensama 2014年5月14日 3:41
    2014年5月13日 17:45

すべての返信

  • MustInherit 付きで宣言された SubClassA は必ず継承して使います。

    http://msdn.microsoft.com/ja-jp/library/aee8f02w.aspx

    挙げられているコードを見ると SuperClass が MustInherit 付きで宣言されていて、 SubClassA~B がそれを継承しているということなのでしょうが、SubClassA にも MustInherit を付けてしまっているのではないでしょうか。

    2014年5月11日 18:48
  • > どの様にしたらオーバーライドできますか。

    エラーメッセージの中のキーワードでググってみることをお勧めします。

    例えば MustOverride でググってみてください。ここ(限られたことしか書けない掲示板の意)で説明を受けるよりよく分かる記事が多々見つかると思います。例えば下記のページ。

    プロフェッショナルVB.NETプログラミング
    第10回 オブジェクト関連(後編)
    http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet10/vb6tonet10_03.html

    #ご自分の環境(OS, .NET, Visual Studio のバージョンなど)を書くようにしてください。

    #回答に対するレスや追加質問は、最初の質問を編集して追記しないで、その回答に対する「返信」として書いてください。最初の質問を編集されると、あとから読む人は訳がわからなくなります。



    • 編集済み SurferOnWww 2014年5月12日 4:33 一部修正
    2014年5月12日 1:12
  •  MustinheritをsudClassA~Cにつけて、            obj(0) = New SubClassA
     NEWの代わりにクラスからインスタンスを、      obj(1) = New SubClassB
     生成する演算子はありませんか。                     obj(2) = New subClassC




    2014年5月12日 19:44
  • ありません。

    SuperClassにてMustOverrideで定義されているメソッド/プロパティを、SubClassA~SubClassCがそれぞれOverridesしてください。

    2014年5月12日 21:25
  • Public MustInherit Class SuperClass
        Public Overridable Sub Disp()
            MessageBox.Show("商品名は登録されていません")

        End Sub
    End Class
    Public MustInherit Class SubClassB
        Inherits SuperClass
        Public Overridable Sub Disp()
            MessageBox.Show("商品名はMANUFACTURです。")
        End Sub

    End Class
    Public Class Form1

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

            Dim obj(2) As SuperClass
            obj(0) = New SubClassA
            obj(1) = New SubClassB
            obj(2) = New subClassC

            For i As Integer = 0 To UBound(obj)
                obj(i).Disp()

            Next
        End Sub
    End Class

    と記述すると、SubClassA~Cにおいて青い波線が表示され、'Mustinherits'で宣言されたクラスでは、NEWを使用することはできません、と出ます。この場合どのようにしたらよいのでしょうか。

    2014年5月13日 17:09
  • 継承にかかわる修飾子の理解が不足しているようなので、リンク先を読んでみてください。

    • MustInherit
      継承しなければならないクラス。不完全なクラスとも言えます。
      不完全なクラスであるためインスタンスをつくることはできません。
      完全なクラスにするには継承が必須です。
    • Overridable
      継承したクラスで上書き可能であるという宣言。
    • Overrides
      継承したクラスで上書きをするという宣言。


    提示されているコードでは、SubClassA,B,CにもMustInheritがついているために継承が必要なクラスになっています。
    インスタンス化(New)するにはMultInheritがついていてはいけません。

    Overridableは基底クラス(SuperClass)で1度宣言すれば十分です。
    継承したクラスではOverridesで上書きします。

    Public MustInherit Class SuperClass Public Overridable Sub Disp() MessageBox.Show("商品名は登録されていません") End Sub End Class Public Class SubClassA 'MustInheritをつけたらインスタンスを作れない(Newできない) Inherits SuperClass Public Overrides Sub Disp() 'OverridableではなくOverrides MessageBox.Show("商品名は******です。") End Sub End Class Public Class SubClassB 'MustInheritをつけたらインスタンスを作れない(Newできない) Inherits SuperClass Public Overrides Sub Disp() 'OverridableではなくOverrides MessageBox.Show("商品名はMANUFACTURです。") End Sub End Class Public Class SubClassC 'MustInheritをつけたらインスタンスを作れない(Newできない) Inherits SuperClass Public Overrides Sub Disp() 'OverridableではなくOverrides MessageBox.Show("商品名はGOODSです。") End Sub End Class Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim obj(2) As SuperClass obj(0) = New SubClassA obj(1) = New SubClassB obj(2) = New SubClassC For i As Integer = 0 To UBound(obj) obj(i).Disp() Next End Sub End Class

    #SubClassAの実装は提示されていないので適当

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2014年5月13日 17:46
    • 回答としてマーク bentensama 2014年5月14日 3:41
    2014年5月13日 17:45
  • 大変勉強になりました、VBの理解に役立ちました。どうもありがとう。
    2014年5月14日 3:42