Как обратиться к полю класса
Перейти к содержимому

Как обратиться к полю класса

  • автор:

Классы, структуры и пространства имен

C# является полноценным объектно-ориентированным языком. Это значит, что программу на C# можно представить в виде взаимосвязанных взаимодействующих между собой объектов.

Описанием объекта является класс , а объект представляет экземпляр этого класса. Можно еще провести следующую аналогию. У нас у всех есть некоторое представление о человеке, у которого есть имя, возраст, какие-то другие характеристики. То есть некоторый шаблон — этот шаблон можно назвать классом. Конкретное воплощение этого шаблона может отличаться, например, одни люди имеют одно имя, другие — другое имя. И реально существующий человек (фактически экземпляр данного класса) будет представлять объект этого класса.

В принципе ранее уже использовались классы. Например, тип string , который представляет строку, фактически является классом. Или, например, класс Console , у которого метод WriteLine() выводит на консоль некоторую информацию. Теперь же посмотрим, как мы можем определять свои собственные классы.

По сути класс представляет новый тип, который определяется пользователем. Класс определяется с помощью ключевого слова сlass :

class название_класса < // содержимое класса >

После слова class идет имя класса и далее в фигурных скобках идет собственно содержимое класса. Например, определим в файле Program.cs класс Person, который будет представлять человека:

class Person

Классы и объекты в языке программирования C# и .NET

Начиная с версии 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($"Имя: Возраст: "); > >

создание классов в языке программирования C# и .NET

Для создания объекта 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 в языке программирования C#

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

Добавление класса в Visual Studio в C#

В появившемся контекстном меню выберем пункт Add -> New Item. (или Add -> Class. )

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

Добавление нового класса в Visual Studio в C#

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

Таким образом, мы можем определять классы в отдельных файлах и использовать их в программе.

Как обратиться к полю объекта класса?

Author24 — интернет-сервис помощи студентам

Как обратиться к полю объекта класса 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *