Наследование работает для первого потомка, но не для следующего. Зачем? - PullRequest
1 голос
/ 21 апреля 2011

Form1

Public Class Form1

Private Sub But_Bell_Click(sender As System.Object, e As System.EventArgs) Handles But_Bell.Click
    MessageBox.Show("Ding a ling")
End Sub

Конечный класс

Первый потомок

Public Class BellsAndWhistles
Inherits Form1
Friend WithEvents But_Whistle As System.Windows.Forms.Button

Private Sub InitializeComponent()
    Me.But_Whistle = New System.Windows.Forms.Button()
    Me.SuspendLayout()
    '
    'But_Whistle
    '
    Me.But_Whistle.Location = New System.Drawing.Point(112, 38)
    Me.But_Whistle.Name = "But_Whistle"
    Me.But_Whistle.Size = New System.Drawing.Size(75, 23)
    Me.But_Whistle.TabIndex = 1
    Me.But_Whistle.Text = "Whistle"
    Me.But_Whistle.UseVisualStyleBackColor = True
    '
    'BellsAndWhistles
    '
    Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
    Me.ClientSize = New System.Drawing.Size(292, 273)
    Me.Controls.Add(Me.But_Whistle)
    Me.Name = "BellsAndWhistles"
    Me.Text = "Bells & Whistles"
    Me.Controls.SetChildIndex(Me.But_Whistle, 0)
    Me.ResumeLayout(False)

End Sub

Private Sub But_Whistle_Click(sender As System.Object, e As System.EventArgs) Handles But_Whistle.Click
    MessageBox.Show("Toot Toot")
End Sub

Конечный класс

First Decendent Designer

Второй потомок

Public Class MoreBellsAndWhistles
Inherits BellsAndWhistles
Friend WithEvents MoreBells As System.Windows.Forms.Button

Private Sub InitializeComponent()
    Me.MoreBells = New System.Windows.Forms.Button()
    Me.SuspendLayout()
    '
    'MoreBells
    '
    Me.MoreBells.Location = New System.Drawing.Point(30, 145)
    Me.MoreBells.Name = "MoreBells"
    Me.MoreBells.Size = New System.Drawing.Size(75, 23)
    Me.MoreBells.TabIndex = 1
    Me.MoreBells.Text = "More Bells"
    Me.MoreBells.UseVisualStyleBackColor = True
    '
    'MoreBellsAndWhistles
    '
    Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
    Me.ClientSize = New System.Drawing.Size(292, 273)
    Me.Controls.Add(Me.MoreBells)
    Me.Name = "MoreBellsAndWhistles"
    Me.Text = "MoreBellsAndWhistles"
    Me.Controls.SetChildIndex(Me.MoreBells, 0)
    Me.ResumeLayout(False)

End Sub

Private Sub MoreBells_Click(sender As System.Object, e As System.EventArgs) Handles MoreBells.Click
    MessageBox.Show("Ting TIng")
End Sub

Private Sub MoreBellsAndWhistles_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

End Sub

Конечный класс

Second Descendant Designer

Куда делась кнопка со свистком?

Классовая часть наследования работает, потому что вы можете получить к ней доступ через код.

1 Ответ

2 голосов
/ 21 апреля 2011

Попробуйте позвонить MyBase.InitializeComponent() от второго потомка.Вам, вероятно, придется изменить уровень доступа к нему тоже.

РЕДАКТИРОВАТЬ

Это беспокоило меня всю ночь.Оказывается, это случай отсутствующих конструкторов.Если вы используете рефлектор, вы увидите, что Form1 имеет конструктор, который вызывает Me.InitializeComponent(), хотя его нет ни в Form1.vb, ни в Form1.Designer.vb.

<DesignerGenerated> _
Public Class Form1
    Inherits Form
    ' Methods
    Public Sub New()
        Me.InitializeComponent
    End Sub

    ...
End Class

Если вы создадитеПриложение C # WinForms, конструктор видим, так что это заставляет меня думать, что это вещь VB, чтобы скрыть это.Кроме того, если вы вручную добавите Sub New к Form1, он заполнит некоторый код для вас, по сути, «скрывая его».

Я предполагаю, что VS посмотрел на ваш код и понял, что это былпотомок System.Windows.Forms.Form, но технически это было сделано неправильно, поскольку он не вызывал MyBase.New() (так как не мог, потому что его не существовало), поэтому он просто пытался угадать.Он «знает», как добавить вызов к InitializeComponent() в форме, которую он создал, и «знает», как это сделать для формы, которую вы просматриваете, но он не потрудился пройтись по цепочке форм и сделать это.для всех них.Ошибка?Может быть.

Когда вы устанавливаете MoreBellsAndWhistles в качестве формы запуска, вы никогда не видите ни одной из новых кнопок, верно?Вот как вы можете сказать, что это более сложная хитрость VS.

В любом случае, решение всей проблемы состоит в том, чтобы добавить это к обоим подклассам:

Public Sub New()
    MyBase.New()
    InitializeComponent()
End Sub

И добавить это кForm1:

Public Sub New()
    InitializeComponent()
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...