Классы, структуры и пространства имен
C# является полноценным объектно-ориентированным языком. Это значит, что программу на C# можно представить в виде взаимосвязанных взаимодействующих между собой объектов.
Описанием объекта является класс , а объект представляет экземпляр этого класса. Можно еще провести следующую аналогию. У нас у всех есть некоторое представление о человеке, у которого есть имя, возраст, какие-то другие характеристики. То есть некоторый шаблон — этот шаблон можно назвать классом. Конкретное воплощение этого шаблона может отличаться, например, одни люди имеют одно имя, другие — другое имя. И реально существующий человек (фактически экземпляр данного класса) будет представлять объект этого класса.
В принципе ранее уже использовались классы. Например, тип string , который представляет строку, фактически является классом. Или, например, класс Console , у которого метод WriteLine() выводит на консоль некоторую информацию. Теперь же посмотрим, как мы можем определять свои собственные классы.
По сути класс представляет новый тип, который определяется пользователем. Класс определяется с помощью ключевого слова сlass :
class название_класса < // содержимое класса >
После слова class идет имя класса и далее в фигурных скобках идет собственно содержимое класса. Например, определим в файле Program.cs класс Person, который будет представлять человека:
class Person

Начиная с версии C# 12, если класс имеет пустое определение, то фигурные скобки после названия типа можно не использовать:
class Person;
Однако такой класс не особо показателен, поэтому добавим в него некоторую функциональность.
Поля и методы класса
Класс может хранить некоторые данные. Для хранения данных в классе применяются поля . По сути поля класса — это переменные, определенные на уровне класса.
Кроме того, класс может определять некоторое поведение или выполняемые действия. Для определения поведения в классе применяются методы.
Итак, добавим в класс Person поля и методы:
class Person < public string name = "Undefined"; // имя public int age; // возраст public void Print() < Console.WriteLine($"Имя: Возраст: "); > >
В данном случае в классе Person определено поле name , которое хранит имя, и поле age , которое хранит возраст человека. В отличие от переменных, определенных в методах, поля класса могут иметь модификаторы, которые указываются перед полем. Так, в данном случае, чтобы все поля были доступны вне класса Person поля определены с модификатором public .
При определении полей мы можем присвоить им некоторые значения, как в примере выше в случае переменной name . Если поля класса не инициализированы, то они получают значения по умолчанию. Для переменных числовых типов это число 0.
Также в классе Person определен метод Print() . Методы класса имеют доступ к его поля, и в данном случае обращаемся к полям класса name и age для вывода их значения на консоль. И чтобы этот метод был виден вне класса, он также определен с модификатором public .
Создание объекта класса
После определения класса мы можем создавать его объекты. Для создания объекта применяются конструкторы . По сути конструкторы представляют специальные методы, которые называются так же как и класс, и которые вызываются при создании нового объекта класса и выполняют инициализацию объекта. Общий синтаксис вызова конструктора:
new конструктор_класса(параметры_конструктора);
Сначала идет оператор new , который выделяет память для объекта, а после него идет вызов конструктора .
Конструктор по умолчанию
Если в классе не определено ни одного конструктора (как в случае с нашим классом Person), то для этого класса автоматически создается пустой конструктор по умолчанию, который не принимает никаких параметров.
Теперь создадим объект класса Person:
Person tom = new Person(); // создание объекта класса Person // определение класса Person class Person < public string name = "Undefined"; public int age; public void Print() < Console.WriteLine($"Имя: Возраст: "); > >

Для создания объекта Person используется выражение new Person() . В итоге после выполнения данного выражения в памяти будет выделен участок, где будут храниться все данные объекта Person. А переменная tom получит ссылку на созданный объект, и через эту переменную мы можем использовать данный объект и обращаться к его функциональности.
Обращение к функциональности класса
Для обращения к функциональности класса — полям, методам (а также другим элементам класса) применяется точечная нотация точки — после объекта класса ставится точка, а затем элемент класса:
объект.поле_класса объект.метод_класса(параметры_метода)
Например, обратимся к полям и методам объекта Person:
Person tom = new Person(); // создание объекта класса Person // Получаем значение полей в переменные string personName = tom.name; int personAge = tom.age; Console.WriteLine($"Имя: Возраст "); // Имя: Undefined Возраст: 0 // устанавливаем новые значения полей tom.name = "Tom"; tom.age = 37; // обращаемся к методу Print tom.Print(); // Имя: Tom Возраст: 37 class Person < public string name = "Undefined"; public int age; public void Print() < Console.WriteLine($"Имя: Возраст: "); > >
Консольный вывод данной программы:
Имя: Undefined Возраст: 0 Имя: Tom Возраст: 37
Добавление класса
Обычно классы помещаются в отдельные файлы. Нередко для одного класса предназначен один файл. Если мы работаем над проектом вне среды Visual Studio, используя .NET CLI, то нам достаточно добавить новый файл класса в папку проекта. Например, добавим новый файл, который назовем Person.cs и в котором определим следующий код:
class Person < public string name = "Undefined"; public void Print() < Console.WriteLine($"Person "); > >
Здесь определен класс Person с одним полем name и методом Print.
В файле Program.cs , который представляет основной файл программы используем класс Person:
Person tom = new Person(); tom.name = "Tom"; tom.Print(); // Person Tom

Visual Studio предоставляет по умолчанию встроенные шаблоны для добвления класса. Для добавления класса нажмем в Visual Studio правой кнопкой мыши на название проекта:

В появившемся контекстном меню выберем пункт Add -> New Item. (или Add -> Class. )
В открывшемся окне добавления нового элемента убедимся, что в центральной части с шаблонами элементов у нас выбран пункт Class . А внизу окна в поле Name введем название добавляемого класса — пусть он будет назваться Person :

В качестве названия класса можно вводить как Person, так и Person.cs. И после нажатия на кнопку добавления в проект будет добавлен новый класс, в котором можно определить тот же код и также использовать в файле Program.cs.
Таким образом, мы можем определять классы в отдельных файлах и использовать их в программе.
Как обратиться к полю объекта класса?

Как обратиться к полю объекта класса Car, который находится в массиве класса Cars?
Помогите пожалуйста разобраться. Ниже три разных модуля. Как обратиться к полю объекта класса Car.
Из одного класса обратиться к полю второго
Есть первый класс, в котором public int option=5; И есть другой класс, в котором мне нужно.
Reflection — обратиться по пути к полю конкретного класса.
Никогда этим не занимался — нужно поскорей понять: Есть типа строка (сам не знаю как должна.
Как обратиться к свойству объекта WPF из метода static класса?
Как обратиться к свойству объекта WPF из метода static класса? Есть окно с меню, надписью и.
172 / 118 / 57
Регистрация: 08.01.2013
Сообщений: 652

Сообщение было отмечено JyYylik как решение
Решение
1 2 3 4 5 6 7 8 9 10 11 12
class Vector { public int x; public int y; public int z; } public static void infoVector(Vector v) { Console.Clear(); Console.WriteLine("Информация о векторе:"); Console.WriteLine("Координаты: x=" + v.x + ", y=" + v.y + ", z=" + v.z); }
Регистрация: 09.12.2019
Сообщений: 119
А как сделать метод универсальным? То есть у меня 2 вектора и про них надо вывести информацию. Как быть в таком случае? Писать 2 метода?
Добавлено через 5 минут
Все, понял. Спасибо!
172 / 118 / 57
Регистрация: 08.01.2013
Сообщений: 652
Сообщение от JyYylik 
То есть у меня 2 вектора и про них надо вывести информацию.
один из вариантов:
1 2 3 4 5 6 7 8
ListVector> list = new ListVector> Vector a, b; list.Add(a); list.Add(b); public static void infoVector(ListVector> _list) { // и здесь уже манипулировать векторами }
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Как обратиться к полю наследника класса
Создал наследника класса PictureABC, обладающего уникальными полями. В процессе работы.

Как обратиться к текстовому полю из другого класса?
Доброго вечера! Подскажите пожалуйста как обратиться к текстовому полю из другого класса? Я что-то.
Как обратиться к объекту класса родителя, из объекта дочерного класса
Вопрос скорее про c++ в целом, чем конкретно про qt имеется классы namespace Ui < class.

Может ли метод родительского класса обратиться к полю дочернего класса
Может ли метод родительского класса обратиться к полю дочернего класса?

Почему дружественная функция не может обратиться к protected полю класса?
Не могу понять, почему функция не может обратиться к protected полю класса: class Ships
как обратиться к полю?
Люди помогите. Провожу интеграцию 1Сv81 с lotus, и мне нужно обратиться к полю в 1С через его.
Или воспользуйтесь поиском по форуму:
Как в методе обратиться к полям наследуемого класса?
Хочу написать метод, в который будет передаваться экземпляр класса и название таблицы и в зависимости от этих параметров будет формироваться запрос на добавление записи в БД к выбранной таблице.
Есть класс Parent от которого наследуются классы tb и new_table. В классе CRUD есть заголовок метода добавления в БД Add:
public static bool Add(Parent instance, string tableName)
В этот метод кладется как параметр экземпляр класса tb или new_table. Например так:
tb c = new tb("", textBox1.Text); CRUD.Add(c, "tb");
При попытке обратиться внутри метода к полям экземпляра класса tb под названием instance их просто не видно.
В классе Parent нет ничего, даже полей и в программе он нужен только для того, чтобы положить экземпляры разных классов как параметр функции.
Реализация класса tb:
public class tb : Parent < private string _id; private string _name; public string Id < get =>_id; set => _id = value; > public string Name < get =>_name; set => _name = value; > public tb(string id, string name) < Name = name; >>
Прошу подсказать:
1. Есть ли возможность как-то обратиться к полям наследуемого класса внутри метода?
2. Если такой возможности нет, то есть ли возможность передавать в метод разные экземпляры класса и что в таком случае должно быть в типе данных у экземпляра класса?
P.S. Вроде нашел способ обратиться к полям экземпляра класса через GetType().GetFields(), однако полученные поля в виде переменной объявленной через var никак не могу привести к типу лист или массив, поэтому бросил эту затею.
P.P.S Если не один из предложенных мной вариантов не является ответом на мой вопрос, то подскажите, куда следует копать. Думаю, что кто-нибудь уж точно задумывался над тем, чтобы реализовать что-то подобное, чтобы не писать для каждого класса отдельные CRUD-функционал. Если я не ошибаюсь, то нечто подобное есть в библиотеке для SQLite и там тоже есть единый метод Add, где нужно передать экземпляр класса и название таблицы.
Буду благодарен любой информации, спасибо
- Вопрос задан 30 мая 2023
- 109 просмотров
Как обратиться к полю класса
Привет!
Подскажите как обратиться к полям базового класса?
Есть Класс Base,
производный приватно от него класс Derived и
производный публично от Derived класс Derived_1.
class Base < public: int i; Base(); const unsigned int get_addr_d(); protected: long l; private: double d; >; class Derived : private Base < private: float f; public: Derived(); Derived(int i1, long l1, float f1); friend ostream& operator; class Derived_1 : public Derived < public: Derived_1(int i1, long l1); //void foo(); >;
Следующий код почему-то не прокатывает:
Derived_1::Derived_1(int i1, long l1) < Derived::i = i1; // Derived::l = l1; cout
На строчке где идет присвоение Derived::i = i1 с ошибкой 'Base::i' is not accessible.
Пишу на на Borlsnd C++ for DOS
Как быть?
P.S. Полный код программы.
#include #include #include int i; class Base < public: int i; Base(); const unsigned int get_addr_d(); protected: long l; private: double d; >; const unsigned int Base::get_addr_d() < return (unsigned int) &d; >Base::Base() < i = 1; l = 10; d = 1.01; coutclass Derived : private Base < private: float f; public: Derived(); Derived(int i1, long l1, float f1); friend ostream& operator; ostream& operator Derived::Derived() < i = 2; l = 20; // d = 2.02; f = 22.22; coutDerived::Derived(int i1, long l1, float f1) < i = i1; l = l1; // d = d1; f = f1; coutclass Derived_1 : public Derived < public: Derived_1(int i1, long l1); //void foo(); >; Derived_1::Derived_1(int i1, long l1) < Derived::i = i1; // Derived::l = l1; cout/*void Derived_1::foo() < i++; l += 1; cout*/ int main()
Участник клубаДжуниор
Регистрация: 23.08.2008
Сообщений: 1,616
При Private-наследовании все спецификаторы меняются на Private, то есть переменная i класса Base будет доступна внутри класса Derived, но предок Derived_1 не сможет к ней обратиться. В данном случае советую использовать Protected-наследование.
pushl $0x18E3DF6B
call ICQ
| russian-stalker |
| Посмотреть профиль |
| Найти ещё сообщения от russian-stalker |
Регистрация: 08.11.2010
Сообщений: 3
Это лабараторная работа.
И в задании сказано, что для решения этой проблеммы нужно использовать возможность восстановления уровня доступа к компонентам базового класса.
Я понимаю, что такая возможность абсурдна, но видимо есть. На лекции нам говорили, что для этого нужно испльзовать оператор расширения области видимости - "::".
Но строчка
Derived::i = i1;
не проходит.
Хотя при публичном наследовании Derived от Derived_1 сама конструкция
Derived::i = i1;
возможна, но тождественна
i = i1.
Участник клубаДжуниор
Регистрация: 23.08.2008
Сообщений: 1,616
А, ну так бы сразу и сказали.
class Derived : private Base < private: float f; public: using Base::i; Derived(); Derived(int i1, long l1, float f1); friend ostream& operator;
Или тот же using, но в protected секции.
pushl $0x18E3DF6B
call ICQ
| russian-stalker |
| Посмотреть профиль |
| Найти ещё сообщения от russian-stalker |