Содержание:
Варианты наследования форм
Варианты наследования. Расход памяти
Всем доброго времени суток. Возник такой вопрос (исключительно в целях.
Классы и наследования
Задание: В зависимоти от заданного дня нужно выбрать класс и вызывать.
использование наследования
Преподаватель одолел не могу разобраться помогите пожалуйста. С# Теория В.
Передать из форм 1, в форм 3.
я перелазил весь форум но так и непонял как передать инфу с textbox3 в.
Иерархия множественного наследования и шаблон
Имеется абстрактный класс Playerpublic abstract class Player <. >от него.
Наследование Winform и размер формы по умолчанию
Приложение, в котором я работаю, будет иметь несколько форм с большим количеством общих функций. Например, каждая форма будет иметь DataGridView , многие из тех же кнопок, большую часть того же кода пользовательского интерфейса и т.д.
Я хотел бы реализовать это, создав базовую версию этой общей формы, подкласса для всех этих очень похожих, но не совсем одинаковых дочерних форм, и придерживаться любых дополнительных элементов управления и функций я необходимо для каждого из них.
Я уже выяснил, что это помогает сделать элементы управления базой protected , потому что это позволяет делать такие вещи, как привязку, к работе. Тем не менее, мне еще предстоит найти способ автоматически сделать производные формы того же размера, что и базовая форма.
Опыт говорит мне, что должен быть простой способ сделать это. Хотя это не большая проблема, просто введите требуемый размер вручную для каждой производной формы сразу после ее создания, я бы предпочел сделать все максимально простым, простым и автоматическим.
Мне интересно, что ваши производные формы автоматически не наследуют размер от их базовой формы, потому что это должно работать без необходимости делать что-либо с этим.
Предполагаемая причина вашей проблемы:
Я подозреваю, что ваша проблема возникает из-за того, что вы используете Visual Studio Forms Designer для редактирования форм. Всякий раз, когда вы редактируете форму, Windows Forms Designer генерирует требуемый код в методе InitializeComponent ваших форм. Среди всего сгенерированного кода - назначения, которые задают размер формы, даже если он идентичен размеру базовой формы. Поэтому вам, возможно, придется вручную прокомментировать эти назначения, если вы хотите, чтобы ваша производная форма имела тот же размер, что и базовая форма, даже если вы изменили размер базовой формы после создания производных форм. (Тем не менее, я не знаю, может ли это привести к дальнейшим проблемам с позиционированием и компоновкой элементов управления.)
После того, как эти строки закомментированы, размер, указанный в вашей базовой форме InitializeComponent , будет использоваться для производной формы.
Обходное решение:
Вы можете сделать следующее, чтобы каждый раз, когда вы редактировали форму, вам не приходилось вручную комментировать код, созданный сгенерированным дизайном:
Создайте форму, полученную из вашей базовой формы; позвоните ему FrozenBaseForm . Вы получите все другие формы из этого класса, а не непосредственно из базовой формы. Теперь в этом "промежуточном" классе вы определяете новое свойство ClientSize :
Это приведет к тому, что все присваивания ClientSize не будут иметь никакого эффекта и, следовательно, сохранить размер из базовой формы. Это похоже на взломать правду, но, похоже, это работает. Возможно, вам придется скрыть свойство Size так же, как и btw.
Как сказано, выведите свои формы из FrozenBaseForm , а не из BaseForm напрямую:
Другой вариант (последнее, если все остальное не работает):
В качестве последнего средства вы можете просто забыть о Forms Designer и просто определить производные формы вручную в редакторе кода (хотя я лично этого не хотел бы делать):
Наследование tablelayoutpanel и сохранение доступности свойств компонентов, расположенных на ней
Есть Form1 на ней protected textbox1 и protected tablelayout1
Есть Form2 :Form1 (наследуется от Form1)
Если textbox1 размещен tablelayout1, то на Form2 доступны его свойства и события.
Если textbox1 разместить в tablelayout1, то все его свойства и события становятся неактивными
Если я руками добаляю код
То в режиме конструктора формы -ошибка
Событие TextChanged доступно только для чтения и не может быть изменено.
в System.ComponentModel.Design.EventBindingService.EventPropertyDescriptor.SetValue(Object component, Object value)
в System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeAttachEventStatement(IDesignerSerializationM anager manager, CodeAttachEventStatement statement)
в System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement(IDesignerSerializationManager manager, CodeStatement statement)
При этом событие нормально отрабатывается. Вопрос такой, как правильнее организовать наследование формы с контролами внутри tablelayout?
Несовместимость по доступности: доступность типа параметра ниже доступности метода
Всем привет! Делаю задание на тему наследия классов. Есть класс «Поликлиника».
Как работать с приведениями типов свойств компонентов
почему выдает ошибку на MessageBox.Show(typeof dateTimePicker1.Value); или.
Задачи на наследование классов, в которых данные описаны в качестве свойств
Создать класс Money для работы с денежными суммами в котором для рублей и.
Сохранение настроек свойств формы
Приветствую, уважаемые форумчане. Пытаюсь реализовать следующий функционал.
Создание 6 компонентов по центру с учетом их visible свойств на tableLayoutPanel
Собственно вопрос как создать 6 штук компонентов на tableLayoutPanel так чтобы.
Наследование форм и создание базовых классов
В этой лекции вы узнаете, как:
- использовать Inheritance Picker (Выбор наследования) для встраивания в проект готовых форм;
- создавать собственные базовые классы с собственными свойствами и методами;
- создавать производные классы на основе базовых классов с помощью оператора Inherits .
Сейчас среди разработчиков программного обеспечения модным словечком стало объектно-ориентированное программирование ( ООП ). Microsoft Visual Basic 4 добавил в язык Visual Basic несколько объектно-ориентированных возможностей программирования, но если верить экспертам, Visual Basic отставал от истинно объектно-ориентированных языков, таких, как Microsoft Visual C++. В Visual Basic отсутствовало наследование - механизм, который позволяет одному классу принимать заранее созданный интерфейс и характеристики поведения от другого класса. Visual Basic . NET теперь поддерживает наследование , что означает, что вы можете создать одну форму в среде разработки и передать ее характеристики и функциональность другим формам. В дополнение к этому вы можете создавать ваши собственные классы и наследовать от них свойства, методы и события. В этой лекции вы будете экспериментировать с обоими типами наследования. Вы узнаете, как с помощью нового инструмента Visual Studio . NET , который называется Inheritance Picker (Выбор наследования), интегрировать существующие формы в ваши проекты, а также узнаете, как создавать собственные классы и с помощью оператора Inherits наследовать от них новые классы. Получив эти навыки, вы сможете использовать множество форм и процедур кода, которые вы уже разработали, что сделает программирование на Visual Basic более быстрым и гибким.
Что нового в Visual Basic .NET?
- Возможность наследования форм в среде разработки Visual Studio с помощью инструмента Inheritance Picker (Выбор наследования).
- Классы теперь определяются между ключевыми словами Public Class и End Class .
- В одном исходном файле теперь может храниться несколько классов, определенных пользователем. (В Visual Basic 6 каждый новый класс должен был храниться в своем собственном файле.)
- Свойства добавляются в класс с помощью нового синтаксиса Visual Studio .NET, а синтаксис Property Get , Property Let и Property Set больше не поддерживается.
- Ключевое слово Inherits позволяет новым производным классам наследовать интерфейс и поведение существующего класса.
Наследование форм с помощью инструмента Выбор наследования
В терминологии объектно-ориентированного программирования наследование означает, что один класс получает объекты, свойства, методы и другие атрибуты другого класса. Visual Basic всегда использует это при создании в среде разработки новой формы. Первая форма проекта ( Form1 ) определена на основе класса System.Windows.Forms.Form и получает от него свои значения по умолчанию. На самом деле каждый раз, когда с помощью команды Add Windows Form (Добавить форму Windows ) из меню Project (Проект) создается новая форма, этот класс указывается в верхней части кода каждой формы с использованием ключевого слова Inherits , как показано ниже:
Вы неосознанно всегда использовали наследование для определения форм Windows , которые использовали при создании приложений Visual Basic . Хотя существующие формы могут наследоваться с помощью кода программы, разработчики Visual Studio . NET сочли эту задачу важной и разработали специальный инструмент среды разработки, облегчающий этот процесс. Этот инструмент называется Inheritance Picker (Выбор наследования). Он доступен через команду Add Inherited Form (Добавить производную форму) в меню Project (Проект). В следующем упражнении вы будете использовать Inheritance Picker (Выбор наследования) для создания второй копии диалогового окна проекта.
Наследование простого диалогового окна
- Запустите Visual Studio и создайте в папке c:\vbnet03sbs\Гл.17 новый проект с именем My Form Inheritance.
- Отобразите форму проекта и используйте элемент управления Button для добавления в нижнюю часть формы двух расположенных рядом объектов кнопок.
- Измените свойства Text кнопок Button1 и Button2 на "OK" и "Отмена" соответственно.
- Чтобы отобразить в Редакторе кода процедуру события Button1_Click , сделайте двойной щелчок мышью на кнопке OK.
Введите следующий оператор программы:
Снова отобразите форму, сделайте двойной щелчок мышью на кнопке Отмена, а затем введите в процедуре события Button2_Click следующий оператор программы:
Снова отобразите форму, а затем установите свойство Text формы на значение "Диалоговое окно". Теперь у вас есть простая форма, которую можно использовать как основу для диалогового окна программы. С помощью некоторых настроек вы можете использовать эту базовую форму для выполнения нескольких задач - просто нужно добавить на нее элементы управления, которые потребуются вашему приложению.
Попрактикуйтесь в наследовании форм. Первым шагом в этом процессе является сборка - или компиляция - проекта, так как наследовать можно только от тех форм, которые скомпилированы в виде файлов .exe или .dll. Каждый раз, когда компилируется базовая форма, изменения, сделанные в этой базовой форме, передаются в производную (наследованную) форму.
Щелкните на команде Add Inherited Form (Добавить производную форму) в меню Project (Проект). Вы увидите диалоговое окно, показанное ниже. Как обычно, Visual Studio приводит список всех возможных шаблонов, которые вы можете включить в проект, а не только те, которые касаются наследования. Но так как разделом по умолчанию на панели Templates (Шаблоны) является Inherited Form (Производная форма), вам не требуется делать никаких изменений. Текстовое поле Name (Имя) в нижней части диалогового окна позволяет присвоить вашей производной форме имя; это имя, которое появится в Solution Explorer (Обозревателе решений) и в имени файла формы на диске.
Щелкните на Open (Открыть), чтобы принять для новой формы установки по умолчанию. Visual Studio отобразит диалоговое окно Inheritance Picker (Выбор наследования), показанное ниже.
Это диалоговое окно содержит перечень всех форм текущего проекта, от которых можно наследовать. Если вы хотите просмотреть другие скомпилированные формы, щелкните на кнопке Browse (Обзор) и найдите на вашем жестком диске требуемый .dll-файл. (Если вы хотите наследовать от формы, которая не является компонентой текущего проекта, форма должна быть скомпилирована в .dll-файл.)
Щелкните в диалоговом окне Inheritance Picker (Выбор наследования) на Form1 , а затем на OK. Visual Studio создаст в Solution Explorer (Обозревателе решений) элемент Form2.vb и отобразит в Windows Forms Designer (Конструкторе Windows Forms) производную форму. На следующем рисунке обратите внимание, что форма выглядит идентично окну Form1 , созданному ранее, за исключением того, что две кнопки содержат маленькие значки, которые указывают, что объекты получены из наследуемого источника.
Иногда сложно отличить производную форму от базовой (маленькие значки наследования не так очевидны), так что используйте для различения этих форм Solution Explorer (Обозреватель решений) и закладки окон среды разработки.
Теперь вы должны добавить к производной форме несколько новых элементов.
Пошаговое руководство. Демонстрация визуального наследования Walkthrough: Demonstrating Visual Inheritance
Визуальное наследование позволяет просматривать элементы управления в базовой форме и добавлять новые элементы управления. Visual inheritance enables you to see the controls on the base form and to add new controls. В этом пошаговом руководстве рассматривается создание базовой формы и ее компиляция в библиотеку классов. In this walkthrough you will create a base form and compile it into a class library. После этого данная библиотека классов импортируется в другой проект и создается новая форма, которая наследуется от базовой формы. You will import this class library into another project and create a new form that inherits from the base form. В этом пошаговом руководстве описаны следующие процедуры. During this walkthrough, you will learn how to:
Создание проекта библиотеки классов, содержащей базовую форму. Create a class library project containing a base form.
Добавление кнопки со свойствами, которые могут изменяться производными классами базовой формы. Add a button with properties that derived classes of the base form can modify.
Добавление кнопки, которая не может изменяться наследниками базовой формы. Add a button that cannot be modified by inheritors of the base form.
Создание проекта, содержащего форму, которая наследуется от BaseForm . Create a project containing a form that inherits from BaseForm .
В конечном счете в этом пошаговом руководстве показано различие между частным и защищенным элементами управления в производной форме. Ultimately, this walkthrough will demonstrate the difference between private and protected controls on an inherited form.
Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих параметров или выпуска. The dialog boxes and menu commands you see might differ from those described in Help depending on your active settings or edition. Чтобы изменить параметры, выберите в меню Сервис пункт Импорт и экспорт параметров . To change your settings, choose Import and Export Settings on the Tools menu. Дополнительные сведения см. в разделе Персонализация интегрированной среды разработки Visual Studio. For more information, see Personalize the Visual Studio IDE.
Не все элементы управления поддерживают визуальное наследование от базовой формы. Not all controls support visual inheritance from a base form. Не поддерживают сценарий, описанный в этом пошаговом руководстве, следующие элементы управления: The following controls do not support the scenario described in this walkthrough:
Эти элементы управления в производной форме всегда доступны только для чтения, независимо от используемых модификаторов ( private , protected или public ). These controls in the inherited form are always read-only regardless of the modifiers you use ( private , protected , or public ).
Шаги сценария Scenario Steps
Первым шагом является создание базовой формы. The first step is to create the base form.
Создание проекта библиотеки классов, содержащей базовую форму To create a class library project containing a base form
Из файл меню, выберите New, а затем проекта открыть новый проект диалоговое окно. From the File menu, choose New, and then Project to open the New Project dialog box.
Создание приложения Windows Forms с именем BaseFormLibrary . Create a Windows Forms application named BaseFormLibrary .
Чтобы создать библиотеку классов вместо стандартного приложения Windows Forms, в обозревателе решений, щелкните правой кнопкой мыши BaseFormLibrary узел проекта, а затем выберите свойства. To create a class library instead of a standard Windows Forms application, in Solution Explorer, right-click the BaseFormLibrary project node and then select Properties.
В свойствах проекта измените тип выходных данных из приложения Windows для библиотеки классов. In the properties for the project, change the Output type from Windows Application to Class Library.
Из файл меню, выберите сохранить все сохранить проект и файлы в расположении по умолчанию. From the File menu, choose Save All to save the project and files to the default location.
Следующие две процедуры выполняют добавление кнопок на базовую форму. The next two procedures add buttons to the base form. Чтобы продемонстрировать визуальное наследование, кнопкам будет заданы разные уровни доступа с помощью свойств Modifiers . To demonstrate visual inheritance, you will give the buttons different access levels by setting their Modifiers properties.
Добавление кнопки, которую могут изменить наследники базовой формы To add a button that inheritors of the base form can modify
Откройте Form1 в конструкторе. Open Form1 in the designer.
На все формы Windows Forms вкладке элементов, дважды щелкните кнопку Чтобы добавить кнопку в форму. On the All Windows Forms tab of the Toolbox, double-click Button to add a button to the form. Измените положение и размер кнопки с помощью мыши. Use the mouse to position and resize the button.
В окне "Свойства" задайте следующие свойства кнопки. In the Properties window, set the following properties of the button:
Задайте текст свойства Say Hello. Set the Text property to Say Hello.
Задайте (имя) свойства btnProtected. Set the (Name) property to btnProtected.
Задайте модификаторы свойства Protected. Set the Modifiers property to Protected. Это позволяет формам, производным от Form1 для изменения свойств btnProtected. This makes it possible for forms that inherit from Form1 to modify the properties of btnProtected.
Дважды щелкните Say Hello , чтобы добавить обработчик событий для щелкните событий. Double-click the Say Hello button to add an event handler for the Click event.
Добавьте следующий код в обработчик событий: Add the following line of code to the event handler:
Добавление кнопки, которая не может изменяться наследующими объектами базовой формы To add a button that cannot be modified by inheritors of the base form
Перейдите в представление конструктора, щелкнув Form1.vb [Design], Form1.cs [Design] или [Design] Form1.jsl вкладке редактора кода или нажав клавишу F7. Switch to design view by clicking the Form1.vb [Design], Form1.cs [Design], or Form1.jsl [Design] tab above the code editor, or by pressing F7.
Добавьте вторую кнопку и задайте ее свойства следующим образом. Add a second button and set its properties as follows:
Задайте текст свойства свидания. Set the Text property to Say Goodbye.
Задайте (имя) свойства btnPrivate. Set the (Name) property to btnPrivate.
Задайте модификаторы свойства частного. Set the Modifiers property to Private. Это не позволяет формам, производным от Form1 для изменения свойств btnPrivate. This makes it impossible for forms that inherit from Form1 to modify the properties of btnPrivate.
Дважды щелкните свидания , чтобы добавить обработчик событий для щелкните событий. Double-click the Say Goodbye button to add an event handler for the Click event. Добавьте следующую строку кода в процедуру обработки события. Place the following line of code in the event procedure:
Из построения меню, выберите собрать библиотеку BaseForm в сборку библиотеки классов. From the Build menu, choose Build BaseForm Library to build the class library.
После сборки библиотеки можно создать новый проект, наследуемый от только что созданной формы. Once the library is built, you can create a new project that inherits from the form you just created.
Создание проекта, содержащего форму, которая наследуется от базовой формы To create a project containing a form that inherits from the base form
Из файл меню, выберите добавить и затем новый проект открыть Добавление нового проекта диалоговое окно. From the File menu, choose Add and then New Project to open the Add New Project dialog box.
Создание приложения Windows Forms с именем InheritanceTest . Create a Windows Forms application named InheritanceTest .
Добавление производной формы To add an inherited form
В обозревателе решений, щелкните правой кнопкой мыши InheritanceTest проекта, выберите добавить, а затем выберите новый элемент. In Solution Explorer, right-click the InheritanceTest project, select Add, and then select New Item.
В Добавление нового элемента выберите Windows Forms категорию (если у вас есть список категорий), а затем выберите производная форма шаблона. In the Add New Item dialog box, select the Windows Forms category (if you have a list of categories) and then select the Inherited Form template.
Оставьте имя по умолчанию Form2 и нажмите кнопку добавить. Leave the default name of Form2 and then click Add.
В Выбор компонентов для наследования выберите Form1 из BaseFormLibrary проект как формы для наследования и нажмите кнопку ОК . In the Inheritance Picker dialog box, select Form1 from the BaseFormLibrary project as the form to inherit from and click OK.
Это создает форму в InheritanceTest проект, который является производным от формы в BaseFormLibrary. This creates a form in the InheritanceTest project that derives from the form in BaseFormLibrary.
Откройте производную форму (Form2) в конструкторе, дважды щелкнув его, если он еще не открыт. Open the inherited form (Form2) in the designer by double-clicking it, if it is not already open.
В конструкторе производные кнопки имеют символ () в верхнем углу, указывающее, они унаследованы. In the designer, the inherited buttons have a symbol () in their upper corner, indicating they are inherited.
Выберите Say Hello кнопку и понаблюдайте за маркеры изменения размера. Select the Say Hello button and observe the resize handles. Так как данная кнопка защищена, то наследники могут ее перемещать, изменять размер, название и вносить другие изменения. Because this button is protected, the inheritors can move it, resize it, change its caption, and make other modifications.
Выберите частную свидания кнопки и обратите внимание, что он не имеет маркеров изменения размера. Select the private Say Goodbye button, and notice that it does not have resize handles. Кроме того, в свойства окне Свойства этой кнопки отображены серым цветом, чтобы указать, их нельзя изменить. Additionally, in the Properties window, the properties of this button are grayed to indicate they cannot be modified.
Если вы используете Visual C#: If you are using Visual C#:
В обозревателе решений, щелкните правой кнопкой мыши Form1 в InheritanceTest проекта, а затем выберите удалить. In Solution Explorer, right-click Form1 in the InheritanceTest project and then choose Delete. В появившемся диалоговом окне щелкните ОК для подтверждения удаления. In the message box that appears, click OK to confirm the deletion.
Откройте файл Program.cs и измените строку Application.Run(new Form1()); на Application.Run(new Form2()); . Open the Program.cs file and change the line Application.Run(new Form1()); to Application.Run(new Form2()); .
В обозревателе решений, щелкните правой кнопкой мыши InheritanceTest проекта и выберите Назначить запускаемым проектом. In Solution Explorer, right-click the InheritanceTest project and select Set As Startup Project.
В обозревателе решений, щелкните правой кнопкой мыши InheritanceTest проекта и выберите свойства. In Solution Explorer, right-click the InheritanceTest project and select Properties.
В InheritanceTest страницы свойств, задайте автоматически запускаемый объект на производную форму (Form2). In the InheritanceTest property pages, set the Startup object to be the inherited form (Form2).
Нажмите клавишу F5 для запуска приложения и понаблюдайте за поведением производной формы. Press F5 to run the application, and observe the behavior of the inherited form.
Следующие шаги Next Steps
Наследование для пользовательских элементов управления работает таким же образом. Inheritance for user controls works in much the same way. Откройте новый проект библиотеки классов и добавьте пользовательский элемент управления. Open a new class library project and add a user control. Поместите на него составные элементы управления и скомпилируйте проект. Place constituent controls on it and compile the project. Откройте еще один новый проект библиотеки классов и добавьте ссылку на скомпилированную библиотеку классов. Open another new class library project and add a reference to the compiled class library. Кроме того, попробуйте добавить наследуемый элемент управления (через Добавление новых элементов диалоговое окно) в проект и с помощью Выбор компонентов для наследования. Also, try adding an inherited control (through the Add New Items dialog box) to the project and using the Inheritance Picker. Добавьте пользовательский элемент управления и измените Inherits ( : в Visual C#) инструкции. Add a user control, and change the Inherits ( : in Visual C#) statement. Дополнительные сведения см. в разделе как: наследование форм Windows. For more information, see How to: Inherit Windows Forms.
См. также See Also
Мы бы хотели узнать ваше мнение. Укажите, о чем вы хотите рассказать нам.
Delphi наследование. Наследование классов и форм Обучающий материал
В Delphi наследование является одним из самых важных механизмов языка, которые широко используются программистами.
С его помощью можно создать новый класс (форму), взяв за основу свойства уже существующего класса (формы). Потомок может иметь свои собственные свойства и методы, а также использовать свойства и методы родительского класса.
Используя delphi наследование можно выстроить целую иерархию объектов, которые будут иметь общие черты, при этом отличаться своими особыми свойствами.
Наследование классов Delphi
Для того, чтобы сформировать более четкое представление о таком механизме объектно-ориентированного программирования, как наследование классов, следует привести пример. Допустим, мы имеем дело с тремя классами: человек, преподаватель и студент. В этом случае класс человек является общим, как для класса студент, так и для класса преподаватель. Ведь студент и преподаватель это люди, только отличающиеся от остальных особыми дополнительными характеристиками. Это классический пример, позволяющий понять, что представляет из себя в delphi наследование.
Принципы, которые подразумевает под собой наследование классов Delphi, были придуманы программистами для того, чтобы один класс мог, имея свой собственный набор свойств и методов, перенимать свойства и методы другого, более общего, класса.
Пример, описывающий в delphi наследование: нужно построить два класса, которые будут являться наследниками общего класса TChelovek. В новых классах будет более конкретно описана личность, которая принадлежит родительскому классу TChelovek.
Предположим, что класс TStud будет представлять студентов, а класс TPrep – преподавателя. Для объявления данных классов нужно написать следующий код.
Итак, получается, что два класса будут наследовать методы и свойства родительского класса TChelovek. Причем, как в первом, так и во втором случае объявлен новый метод PersonToStr, который должен будет представить особую информацию о том или ином человеке в виде строки. Как видно из примера, в delphi наследование использовать достаточно просто.
Наследование форм Delphi
Форма – это основа программы. Именно на ней, подобно фундаменту здания, базируется все остальное. Через форму пользователи могут взаимодействовать с программой. В одном и том же приложении может использовать несколько разных форм.
Применяя наследование форм Delphi, разработчики получают уникальную возможность повторно использовать все необходимые свойства родительской формы, а также внести новые изменения в форму-потомок. Иначе говоря, при копировании ранее созданной формы программисты добавляют в нее изменения, код и компоненты.
Единственным минусом копирования “Copy” заключается в том, что сделанные изменения не заносятся в шаблон. Для того, чтобы изменения были выполнены не только в шаблоне, но и в других проектах, следует использовать “Use”.
Применяя наследование форм можно с легкостью создать большое количество вариантов шаблона. В случае применения “Copy” они будут отличаться друг от друга. Воспользовавшись “Use” все изменения в автоматическом порядке будут внесены в объект хранилища.
Объектно-ориентированное программирование (Учебное пособие). Автор: Шахгельдян К.И. , редактор: Александрова Л.И.
Не множьте объекты без необходимости
Первым шагом при изучении объектно-ориентированного программирования было осознание задачи как взаимодействия программных компонент. Следующим шагом в изучении объектно-ориентированного программирования становится организация классов в виде иерархической структуры, основанной на принципе наследования.
Вспомним задачу поздравления родственника с днем рождения. Мы прибегли к услугам почты, а точнее конкретного почтового служащего. Приняв наш заказ и оплату, почтовый служащий выдал нам квитанцию и стал выполнять принятый заказ. Эти действия не являются уникальными не только для данного почтового служащего, но и для многих других почтовых служащих, а главное и для многих служащих в сфере услуг вообще. Таким образом, можно выделить общее поведение всех служащих, частным представителем которых являются почтовые служащие.
В языках программирования наследование означает, что поведение и данные, связанные с дочерним классом, всегда являются расширением свойств, связанных с родительским классом. Подкласс имеет все свойства родительского класса и, кроме того, дополнительные свойства. С другой стороны, так как дочерний класс является более специализированной (или ограниченной) формой родительского класса, он также будет сужением родительского класса. Это диалектическое противоречие между наследованием как расширением и наследованием как сужением вызывает некоторую путаницу.
Наследование всегда транзитивно, то есть класс наследует черты надклассов (базовых классов), отстоящих от него на несколько уровней. Например, если собака – это дочерний класс класса млекопитающих, а млекопитающие – это дочерний класс класса животных, то собака наследует свойства класса и млекопитающих и животных.
Подклассы (дочерние классы) могут переопределять поведение, унаследованное от родительского класса. Например, класс утконосов переопределяет процедуру размножения, унаследованную от родительского класса млекопитающих.
Рассмотрим связь между родительским классом и дочерним классом.
¨ Представители подкласса должны владеть всеми областями данных родительского класса.
¨ Представители подкласса должны обеспечивать выполнение, по крайней мере, через наследование всех функциональных обязанностей родительского класса. У дочернего класса могут появиться дополнительные обязанности.
¨ Представитель дочернего класса может имитировать поведение родительского класса и должен быть неотличим от представителя родительского класса в сходных ситуациях [1].
Принцип подстановки утверждает, что если есть два класса А и В такие, что класс В является подклассом класса А (возможно, отстоя в иерархии на несколько ступеней), то мы должны иметь возможность подставить представителя класса В вместо представителя класса А в любой ситуации, причем без видимого эффекта.
Если принцип подстановки выполняется, то подкласс называется подтипом. Обычно подтип можно распознать, применив к нему форму:
является ли объект типа В объектом типа А ?
Если ответ положительный, то скорее всего мы имеем дело с подтипом.
Наследование имеет очень много форм, некоторые из них обеспечивают порождение подтипов, а другие нет [1].
¨ Порождение подклассов для специализации (порождение подтипов)
Новый класс является специализированной формой родительского класса, но удовлетворяет спецификациям родителя во всех существенных моментах. Для этой формы полностью выполняется принцип постановки.
Например, базовый класс окно, полностью описывающий операции с окнами. Специализированный подкласс текстовых окон дополнительно обладает свойствами отображать текстовую информацию. Текстовое окно является окном и, следовательно, является подтипом типа окна.
¨ Порождение подкласса для спецификации
Этот вариант наследования гарантирует поддержку классами определенного общего интерфейса, то есть реализацию ими одних и тех же методов. Родительский класс может быть комбинацией реализованных методов и методов, реализацию которых доверили дочерним классам. Эта форма наследования напоминает порождение подклассов для специализации, за исключением того, что подклассы являются не усовершенствованием существующего типа, а скорее реализацией, неполной, абстрактной спецификации. В таких случаях родительский класс называют абстрактно специфицированным классом.
Эта и предыдущая форма наследования являются идеальной формой наследования, к которой должна стремиться любая объектно-ориентированная программа.
¨ Порождение подкласса с целью конструирования
Иногда класс наследует почти все функциональное поведение родительского класса, изменяя только имена методов или модифицируя аргументы. Примером может служить иерархия классов, где базовый класс предназначен для сохранения двоичных данных в файле, а производный класс записывает некоторую структуру.
class StoreMyStruct: public Storable
Порождение подкласса для конструирования нарушает принцип подстановки. В языках со статическим типом данных (С++, Java ) такое порождение нежелательно. Но в языках с динамическим типом данных этот подход широко используется.
¨ Порождение подкласса для обобщения
Эта форма наследования некоторым образом противостоит порождению для специализации. В этом случае подкласс расширяет родительский класс для создания объекта более общего типа. Такая форма наследования часто объясняется невозможностью изменить код базового класса, с одновременным желанием его использовать. Примером порождения для обобщения может служить базовый класс окно и производный от него цветное окно. В производном классе добавятся одна переменная, отвечающая за цвет, и новая процедура отображения. Очевидно, что базовый тип – окно – является более узким типом, чем цветное окно, которое имеет некоторый строго заданный цвет. В данном случае мы имеем дело с перевернутой иерархией. В большинстве случаев желательно избегать такой формы наследования, но это не всегда возможно. Следует отметить, что данная форма наследования поддерживает принцип подстановки.
¨ Порождение подкласса для расширения
Порождение подкласса для расширения добавляет совершенно новые свойства. Расширение не переопределяет методы, а лишь добавляет новые. Примером может служить класс StringSet – множество строк. Такой класс имеет дополнительные методы для строковых операций, например "найти по префиксу". Такие методы не имеют смысла для родительского класса. Эта форма наследования также не нарушает принципа подстановки.
¨ Порождение подкласса для ограничения
Такая форма наследования имеет место тогда, когда возможности подкласса ограничены по сравнению с родительским классом. Например, на основе базового класса – очередь с двумя концами проектируется подкласс стек. Переопределенные методы производного класса ограничивают базовый класс и противоречат принципу подстановки. Такую форму наследования следует избегать, где только возможно.
¨ Порождение подкласса для варьирования
Эта форма наследования применяется в том случае, когда два класса имеют сходную реализацию, но нет никакой явной связи между ними. Например, классы, отвечающие за отображения на экране монитора и на печати на принтере, могут иметь очень похожую реализацию, но нет никакой причины считать класс Display базовым или производным по отношению к классу Printer . Часто в таком случае выбирают один (произвольный) класс базовым, а другой – производным. Лучшим решением может быть выделение общих абстракций (или реализаций) в абстрактный базовый класс, отвечающий за вывод на устройство. А классы Display и Printer сделать производными классами по форме порождения для специализации.
¨ Порождение подкласса для комбинирования
Эта форма наследования имеет отношение ко множественному наследованию, когда производный класс желает иметь черты нескольких базовых классов. Например, помощник учителя несет в себе черты учителя и ученика одновременно.