Класс можно сконструировать но это не первый класс в файле
Что такое ООП
Раньше программистам приходилось весь функционал программы записывать в одном файле. Что в будущем неизбежно приводило к путанице из-за нескольких сотен и даже тысяч строк. А с приходом классов появилась возможность отделять любую часть программы в отдельный файл.
Например один файл отвечает за инициализацию введенных данных, другой за считывание производительности. Таким образом стала возможным структурировать программу.
В ООП входит такие свойства:
- Инкапсуляция — это возможность задавать разную область видимости определенной части класса .
- Наследование — это свойство создавать новый класс на базе старого. Такие классы называют потомками, например, есть класс магазин , на базе которого можно создать потомки продуктовый_магазин , магазин_одежды (не обращайте внимание, что название на русском языке).
- Полиморфизм — возможность создать объекты с одинаковым интерфейсом, но с разной их реализацией. Например, есть три класса треугольник , круг и квадрат . У каждого из них есть метод SquarePlis() , который вычисляет площадь фигуры. Но для каждого класса функция реализована по-разному.
Конструкторы
Класс и объект: в чем отличие?
В свое время, для самого себя я провел следующую аналогию между классами и объектами в программировании и материальным миром: есть чертеж, например, дома, а есть сам дом. Чертеж может содержать описание свойств дома (длина, ширина, высота и т.д.). Так вот, чертеж — это класс, а дом — это объект (реальная сущность, которую можно измерить, потрогать и так далее). Конечно, это очень упрощенная аналогия, не в полной мере описывающая что такое класс,а что такое объект, но, тем не менее, для начала изучения классов и объектов нам этого должно хватить.
Ключевым словом class мы указываем на то, что создаем тип данных — класс. Далее идёт название класса,а в фигурных скобках указываются поля, свойства, методы класса и прочие интересные вещи с которыми мы будем постепенно знакомиться.
Своё приложение я назвал FirstClass . Теперь мы могли бы объявить наш новый класс прямо в этом файле, но я бы рекомендовал сразу привыкать к вышеизложенному правилу: 1 файл = 1 класс, поэтому кликаем правой кнопкой мыши по названию проекта в «Обозревателе решений» Visual Studio и выбираем пункт меню «Добавить — Создать элемент»:
В появившемся окне выбираем первый пункт — «Класс» и в самом низу окна задаем название файла. Например, я дал файлу название «Building.cs»
Нажимаем кнопку «Добавить» и Visual Studio создаст нам новый файл следующего содержания:
Обратите внимание, что, по умолчанию, наш новый класс получил имя по имени файла ( Building ) и размещен он в том же пространстве имен, что и класс Prorgam нашего приложения. Теперь нам необходимо наделить наш класс определенной функциональностью. Вся функциональность класс представляется его членами — полями, свойствами, методами и событиями. О каждом из членов класса мы поговорим подробнее, а сегодня воспользуемся только двумя из них — полями и методами.
Поле класса (или второе название — атрибут) — это переменная , описание которой мы даем при создании класса. Например, здание ( Building ) имеет свою ширину, длину и высоту. Создадим три поля:
Теперь наш класс содержит три поля, в которых будут храниться данные о нашем здании.
Будем считать, что все здания имеют прямоугольную форму, напишем метод, позволяющий рассчитать объем нашего здания:
Итак, мы создали новый тип данных — класс Building . Для того, чтобы использовать возможности этого класса в своем приложении, мы должны создать переменную этого типа (объект) и инициализировать её. Для инициализации объектов используются специальные методы — конструкторы.
Итого
Вылезла непонятная ошибка, я в этот момент случайно нажал куда то, и конструктор пропал, не могу разобраться, f7 и тд нажимал, толку нет.
Простой 2 комментария
Решил проблему так.
У меня было два класса, описанные в таком порядке:
public class DataGridViewRowComparer : IEqualityComparer
public partial class Form1 : Form
Просто поменял их местами, т.е.
public partial class Form1 : Form
и потом уже
public class DataGridViewRowComparer : IEqualityComparer
Раскройте файл Form1.cs (нажмите на стрелку слева от файла) и там кликните левой кнопкой мыши два раза на Form1.Designer.cs
на скрине вижу, что что-то также называется Form1 но без расширения (предпоследний на скрине). может переименовали что-то?. Если уж совсем не помогло -> создайте новый проект и скопируйте заново код
UPD:
+
найдите нечто похожее: Restore workspace
UPD:
+
Обратите внимание на второй файл Form1 (без расширения). Что это за файл? Может он мешает?
у меня была подобная ошибка
Класс Form1 можно сконструировать, но это не первый класс в файле. В Visual Studio конструктор должен использовать первый класс в файле. Переместите код класса, чтобы он был первым в файле, и еще раз попробуйте загрузить конструктор.
Экземпляры ошибки (1)
1. Скрыть стек вызовов
Спасибо Вам, решил вопрос. Оказывается классы в Form.cs надо было местами поменять да и всего то..
У меня было два класса, описанные в таком порядке:
public class DataGridViewRowComparer : IEqualityComparer
public partial class Form1 : Form
Просто поменял их местами, т.е.
public partial class Form1 : Form
и потом уже
public class DataGridViewRowComparer : IEqualityComparer
Этот класс имеет функции, которые нам нужны во всех наших последующих сервисах, такие как стандартизированное планирование выполнения и функции ведения журнала.
В новый проект я добавляю следующее:
В конструкторе Windows класс отображается правильно.
Когда я меняю службу на производную от OurServiceBase
Конструктор перестает работать:
Полная ошибка: не удалось показать конструктор для этого файла, потому что ни один из классов в нем не может быть спроектирован. Дизайнер проверил следующие классы в файле: EmailProcessor --- Не удалось загрузить базовый класс OurSharedLibrary.CienaServiceBase. Убедитесь, что на сборку есть ссылка и что все проекты построены.
Имеются ссылки на соответствующие сборки, проект строится. Я не понимаю, почему дизайнер нервничает из-за этого, поскольку мой сервис в конечном итоге происходит от проектируемого класса.
Любые предложения приветствуются.
Дополнительная информация - стек вызовов от дизайнера, когда он отображает ошибку о невозможности разработать производный сервис:
19.07.2011 14:34 EDT Новое открытие.
Класс «OurServiceBase» существует в отдельном проекте (обычно упоминается только как DLL). По прихоти я скопировал файл базового класса в свой проект, построил и открыл конструктор. Это сработало! Когда я снова удалил файл базового класса и вернулся к ссылке на внешнюю DLL, дизайнер снова сломался.
Лучше всего было бы начать с версии OurServiceBase без каких-либо функций и посмотреть, сможете ли вы спроектировать MyService . Если да, то медленно добавляйте функциональность, пока она не сломается.
Поскольку похоже, что у Visual Studio возникла проблема с сериализацией одного из членов OurServiceBase .
Вы также можете получить эту ошибку, если ваша форма находится в общем проекте. Обходной путь - исключить файл из общего проекта, а затем создать ссылки на файл в основных проектах.
Перейдите в Проект > > > Система в поле " Подсистема "выберите" Windows ( / SUBSYSTEM: WINDOWS ) ", нажмите" Применить ".
Перейдите в Проект > > > Дополнительно в поле " точка входа". ", введите значение" Main "и" Применить ", наконец, нажмите" ОК ".
Перейдите к коду файла созданной вами формы (например, MyForm.cpp ) и введите приведенный ниже код в этот файл:
using namespace System;
using namespace System::Windows::Forms;
void Main(array^ args)
Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); Project1::MyForm form; Application::Run(%form);
В дополнение к ответу Ausibanez выше.
Мое приложение было в X64, но моя проблема заключалась в том, что я недавно добавил ссылку COM на WIA (Windows Image Acquisition), что и было проблемой.
этот класс имеет функциональность, которую мы хотим во всех наших нижестоящих службах, таких как стандартизированное планирование выполнения и ведение журнала.
в новом проекте я добавляю следующее:
в конструкторе Windows класс отображается правильно.
когда я меняю службу на производную от OurServiceBase
дизайнер останавливается работа:
полная ошибка: Конструктор не может быть показан для этого файла, так как ни один из классов в нем не может быть разработан. Конструктор проверил следующие классы в файле: EmailProcessor - - - базовый класс ' OurSharedLibrary.Не удалось загрузить CienaServiceBase. Убедитесь, что ссылка на сборку и что все проекты были построены.
ссылки на соответствующие сборки, сборки проекта. Я не понимаю почему дизайнер переворачивает это, так как мой сервис в конечном счете является производным от designable класса.
любые предложения будут приветствоваться.
бит больше информации-стек вызовов от конструктора, когда он отображает ошибку о невозможности разработки производной службы:
7/19/2011 2: 34PM EDT новое открытие.
класс "OurServiceBase" существует в отдельном проекте (обычно упоминается только как DLL). По прихоти, я скопировал файл базового класса в мой проект, построил и открыл конструктор. Он работал! Когда я снова удалил файл базового класса и вернулся к внешней ссылке DLL, конструктор снова сломался.
лучше всего было бы начать с версии OurServiceBase без функции и посмотреть, если вы можете дизайн MyService . Если да, то медленно добавляйте функциональность до тех пор, пока она не сломается.
поскольку похоже, что Visual Studio имеет проблему с сериализацией одного из членов OurServiceBase .
также вы можете попробовать сделать это:
- закройте все страницы дизайна пользовательского интерфейса
- Очистить Решение
- Построить Решение
- откройте нужные страницы дизайна пользовательского интерфейса
Это может помочь или не помочь, но это, безусловно, решило ту же проблему в моем проекте.
на случай, если кому-то вроде меня придется работать над старой базой проектов в Visual Studio 2008 и столкнуться с той же проблемой.
пример, мой путь выглядит так :
когда он переименован в
Visual Studio теперь может распознавать родительский класс, а затем открывать форма с унаследованной формой.
вы также можете столкнуться с этой проблемой, если ваш элемент управления/служба наследуется от универсального класса. Дизайнер не ладит с абстрактными классами в иерархии, так как он должен создавать их экземпляры.
произошло несоответствие между процессорной архитектурой строящегося проекта " MSIL "и процессорной архитектурой эталонного" C. dll", "x86". Это несоответствие может привести к сбоям во время выполнения. Пожалуйста, подумайте об изменении целевого архитектура процессора проекта через Configuration Manager, чтобы выровнять архитектуры процессора между проектом и ссылками или принять зависимость от ссылок с архитектурой процессора, которая соответствует целевой архитектуре процессора проекта.
Всем привет! Объекты очень важная вещь в программировании, которая может облегчить решения многих задач. Например нужно вести дневник пользователя: год рождения, имя, фамилия, местожительство, все это можно продолжать еще очень долго. Поэтому, как и другие языки программирования C++ обзавелся — классами.
Как создать класс
Чтобы объявить класс нужно использовать данную конструкцию:
Обычно прописывают с заглавной буквы. Также в конце обязательно должна присутствовать точка с запятой ( ; ).
Собственные конструкторы
Об этом ключевом слове мы ещё поговорим, а пока вернемся к нашему классу. После того как вы создадите свой конструктор конструктор по умолчанию перестанет использоваться и вы увидите в списке ошибок в Visual Studio следующую ошибку:
Ошибка CS7036 Отсутствует аргумент, соответствующий требуемому формальному параметру «width» из «Building.Building(double, double, double)».
Наш конструктор должен содержать три обязательных параметра и теперь создать объект класса мы можем, например, так:
И теперь два следующих объекта будут абсолютно идентичны:
Объем второго здания: 1200
Инициализаторы объектов
Инициализаторы объектов позволяют присваивать значения всем доступным извне полям и свойствам объекта в момент его создания без явного вызова конструктора. Чтобы продемонстрировать использование инициализаторов объектов, изменим наш класс следующим образом: во-первых, все поля класса сделаем доступными извне — добавим им модификатор public и, во-вторых, напишем ещё один конструктор:
Второй конструктор также использует ключевое слово this , то есть, при вот таком создании объекта:
будет вызван наш первый конструктор с параметрами 20, 20, 3 . Теперь посмотрим, как мы можем воспользоваться инициализатором объекта:
Здесь мы в фигурных скобках указали значение всем публичным полям класса и без явного вызова конструктора создали объект. При этом следует учитывать следующие особенности инициализатора объектов:
- используя инициализатор мы можем установить значения только доступных из внешнего кода полей и свойств объекта. Именно поэтому мы добавили к нашим полям модификатор public .
- несмотря на то, что явного вызова конструктора не было, конструктор вызывается (в нашем примере был вызван второй конструктор — без параметров) и только после вызова конструктора выполняется инициализатор. Таким образом, мы перезаписали поля нашего объекта в инициализаторе.
Проверить второй пункт достаточно просто — создадим снова два объекта зданий: один — с конструктором, второй — с инициализатором и посмотрим на вывод консоли:
Объем второго здания: 1200
Как видите, инициализатор объекта перезаписал значение полей и в консоли мы увидели значение 6000 .
Конструктор по умолчанию
Конструктор по умолчанию не имеет ни параметров ни тела. Если вы при описании класса не создаете свой конструктор, то при создании объекта используется конструктор по умолчанию. Например, создадим объект здания, используя конструктор по умолчанию. Для этого, кликните в обозревателе решений левой кнопкой мыши по файлу «Program.cs» и напишите следующий код:
Здесь мы объявили переменную (объект) building типа Building (нашего класса) и инициализировали её, используя конструктор по умолчанию. Чтобы создать объект мы использовали ключевое слово new (этот оператор выделяет память для нового объекта) и для вызова конструктора поставили после названия класса круглые скобки. После этого, переменная building будет содержать ссылку на объект в памяти. Во второй строке мы вывели в консоль объем нового здания. Ну, а так как по умолчанию у нас все переменные вещественного типа инициализируются значением 0 , то при запуске приложения мы увидим в консоли вот такую запись:
Что такое класс
Это абстрактный тип данных. Он сочетает в себе два функционала:
- Первая — это структура, в которой можно хранить различные типы данных: массивы, переменные, функции.
- Вторая — возможность пользоваться объектно-ориентированным программированием (ООП — об этом ниже).
Создав класс можно создать его экземпляр — объект. Объект — это функционирующий прототип класса, которому можно задавать свойства и вызывать методы.
У каждого вами созданного класса могут быть свойства и методы. Свойства — это все что может хранить информацию, которую вы потом можете заполнять (переменные, массивы и т.д.).
Так свойства класса Worker (рабочий) может иметь — имя, производительность (полезность работы) за 6 месяцев, среднюю производительность.
Методы — это обычные функции, в функционале которых можно использовать свойства.
Чтобы обратится к свойствам и методам класса нужно перед названием имени свойства поставить точку . .
Читайте также: