Можно ли добавить ссылку на некоторый исходный код для включения в исходный файл в vb.net, winforms? - PullRequest
5 голосов
/ 26 января 2010

Я не знаю, как это называется, поэтому я изо всех сил пытался найти ответ от Google, но у меня смутные воспоминания об этом с давних времен.

Я подклассифицировал (* см. Ниже) около 8 элементов управления каркасом, переопределил некоторые свойства и добавил некоторые функциональные возможности в каждый из них. Изменения, которые я сделал, идентичны в каждом случае. Если я внесу изменение, я должен пройти через каждый класс и применить то же самое изменение там. Я надеялся, что может быть ключевое слово, такое как , которое я могу вставить в каждый класс.

Есть шанс?

(* примечание) Я использую термин подкласс, но я не знаю, правильная ли это терминология. Я также видел, что это используется для обратных вызовов. Подклассы правильный термин для использования?

Ответы [ 6 ]

1 голос
/ 26 января 2010

Я помню, как читал где-то, что Microsoft приняла конкретное дизайнерское решение (по крайней мере, в C #), чтобы не допустить такого включения внешнего исходного кода.

Было высказано мнение, что, хотя включение исходных файлов может быть полезным в C ++, оно также может привести к усложнению и снижению читабельности.

На языке ОО обычно есть хорошие альтернативы, наиболее очевидными из которых являются составление и делегирование объектов.

Вот как я справлялся с этой ситуацией в прошлом:

class CommonCode
{
    public void HandlePaint(Control c, PaintEventArgs a)
    {
        // Do shared code
    }
    public void HandleResize(Control c)
    {
        // Do shared code
    }

}

class MyButton : Button
{
    private CommonCode m_common=null;

    public MyButton()
    {
        m_common=new CommnCode();        
    }
    protected override OnPaint(PaintEventArgs a)
    {
        m_common.HandlePaint(this,a);
    }

    protected override void OnResize(EventArgs e)
    {
        m_common.HandleResize(this);
    }

}

class MyTextbox :Textbox
{

    private CommonCode m_common=null;

    public MyTextbox()
    {
        m_common=new CommnCode();        
    }
    protected override OnPaint(PaintEventArgs a)
    {
        m_common.HandlePaint(this,a);
    }

    protected override void OnResize(EventArgs e)
    {
        m_common.HandleResize(this);
    }

}
1 голос
/ 26 января 2010

Я бы поддержал ответ nobugz. Даже если бы было #Include утверждением, я не думаю, что это было бы хорошей идеей. Любое изменение во включаемом файле может легко сломать любой из ваших 8 подклассов пользовательских элементов управления.

НО : что может работать , , если , то все общие изменения могут быть интегрированы в пользовательские элементы управления подклассами через обработчики событий, или если изменения относятся к типу, в котором вы устанавливаете общие свойства ваших пользовательских элементов управления для определенных значений, это класс, который применяет изменения кода к любому переданному ему пользовательскому элементу управления:

Class CommonChanges

    Private Readonly WithEvents DerivedUserControl As Windows.Forms.Control

    Public Sub New(ByVal derivedUserControl As Windows.Forms.Control)
        Me.DerivedUserControl = derivedUserControl
    End Sub

    Private Sub DerivedUserControl_OnClick(sender As Object, e As EventArgs) _
                Handles DerivedUserControl.Click
        ' ... '
    End Sub

    ...  ' (more event handlers with common code go here) '

End Class

Затем вы определяете свои 8 пользовательских элементов управления, например:

Class MyDerivedUserControl
    Extends Button  ' (or whatever control it extends) '

    Private ReadOnly Changes As CommonChanges

    Public Sub New
        Changes = New CommonChanges(Me)
        ' ^ 'CommonChanges' will subscribe to this class's events and possibly
        '   apply other changes to the control object 'Me'.
        ...
    End Sub
End Class

Этот объект Changes типа CommonChanges будет подписываться на события вашего класса MyDerivedUserControl и подключать к ним обработчики, определенные в CommonChanges.

Кроме того, вы можете напрямую применить изменения к объекту Control, переданному конструктору CommonChanges.

1 голос
/ 26 января 2010

Это может быть сумасшедшая идея, но ...

  1. Создайте файл common.vb с нужным кодом.
  2. Создайте файлы частичных классов для каждого из ваших элементов управления, куда вы добавите пример кода.
  3. Создайте командный файл, который скопирует данные из вашего common.vb в ваши частичные классы
  4. Создайте шаг предварительной сборки, который выполняет этот пакетный файл.

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

И это, конечно, при условии, что в VB.NET есть концепция частичных классов. И нет, я не пробовал это дома ...; -D

1 голос
/ 26 января 2010

Я серьезно сомневаюсь, что это сработает для вас. Вы не можете использовать файл включения, чтобы вставить изменения в производные элементы управления. Обычно вы вносите изменения в общий базовый класс, например, производный от Control, а затем выводите отдельные элементы управления из этого базового класса. Но это не сработает, если вы настроили 8 отдельных классов управления. Копируй и вставляй - это твой лот.

0 голосов
/ 26 января 2010

Вы можете создать проект библиотеки классов (выход будет dll) из Visual Studio:

Новый проект -> Библиотека классов

Вы можете поместить весь свой код туда, затем вы можете просто добавить ссылку на библиотеку классов в проект, из которого вы хотите его использовать (ссылки правой кнопкой мыши в обозревателе решений):

Ссылки -> Добавить ссылку -> Проекты -> MyClassLibrary

Чтобы найти MyClassLibrary на вкладке проектов, оба проекта должны быть в одном решении - в противном случае вы можете просто перейти к просмотру и указать на саму dll.

Тогда в .vb-файле вам нужно использовать ваши классы, вы можете выполнить импорт MyClassLibrary:

// assuming the namespace is MyClassLibrary
imports MyClassLibrary

На данный момент вы можете просто использовать свои подклассы и элементы управления. Если вы пойдете MyClassLibrary. intellisense покажет вам все ваши классы.

0 голосов
/ 26 января 2010

Скомпилируйте ваши общие классы в свои собственные DLL.

Затем установите ссылку на свою DLL в Visual Studio, щелкнув правой кнопкой мыши папку «Ссылки» в обозревателе решений.

Наконец, добавьте операторы Using в классы вашего проекта для пространств имен в вашей новой DLL.

...