Классы и Объекты Flashcards
Что такое Классы?
Классы - это своего рода шаблон или “фабрика” для создания объектов, которые могут выполнять одинаковые действия.
class Person {
// Свойства класса
String name;
int age;
// Конструктор класса
Person(this.name, this.age);
// Метод класса
void introduce() {
print(‘Привет, меня зовут $name, и мне $age лет.’);
}
}
void main() {
// Создание объекта класса
Person person1 = Person(‘Кейт’, 20);
Person person2 = Person(‘Алекс’, 25);
// Вызов метода объекта
person1.introduce(); // Вывод: Привет, меня зовут Кейт, и мне 20 лет.
person2.introduce(); // Вывод: Привет, меня зовут Алекс, и мне 25 лет.
}
Что такое объекты?
Это экземпляры классов.
Каждый объект может иметь свои собственные значения свойств (переменных).
Сколько конструкторов может быть в одном классе?
В Dart можно иметь несколько конструкторов для одного класса с помощью именованных конструкторов.
То есть, один класс может иметь один основной конструктор и несколько именованных конструкторов.
Это полезно, когда нужно создавать объекты класса с разными наборами данных.
Именованные конструкторы позволяют более гибко создавать объекты класса с разными начальными условиями.
class Person {
String name;
int age;
// Основной конструктор
Person(this.name, this.age);
// Именованный конструктор
Person.withName(this.name) {
age = 0; // Устанавливаем возраст по умолчанию
}
// Еще один именованный конструктор
Person.withAge(this.age) {
name = ‘Неизвестно’; // Устанавливаем имя по умолчанию
}
}
void main() {
Person person1 = Person(‘Алекс’, 25); // Основной конструктор
Person person2 = Person.withName(‘Кейт’); // Именованный конструктор
Person person3 = Person.withAge(30); // Другой именованный конструктор
print(person1.name); // Вывод: Алекс
print(person2.age); // Вывод: 0
print(person3.name); // Вывод: Неизвестно
}
Что может содержаться внутри класса?
В классе могут быть геттеры и сеттеры, статические переменные и методы, константы, приватные свойства и методы, абстрактные методы и классы.
Напиши пример класса Car.
class Car {
String model;
int year;
// Конструктор класса
Car(this.model, this.year);
// Метод для отображения информации о машине
void displayInfo() {
print(‘Модель: $model, Год: $year’);
}
}
void main() {
Car car1 = Car(‘Toyota’, 2020);
Car car2 = Car(‘Honda’, 2018);
car1.displayInfo(); // Вывод: Модель: Toyota, Год: 2020
car2.displayInfo(); // Вывод: Модель: Honda, Год: 2018
}
В чем разница между классом и функцией?
Несмотря на сходство, между классами и функциями есть важные отличия:
Инкапсуляция: Классы позволяют организовать данные и методы, связанные с этими данными, в одном месте. Это способствует лучшей организации кода и инкапсуляции (скрытию деталей реализации). Наследование и полиморфизм: Классы могут наследоваться друг от друга, что позволяет создавать иерархии и переопределять методы. Функции не имеют этой возможности. Состояние: Объекты классов могут хранить состояние через свои свойства, а функции, как правило, не имеют собственного состояния.
Таким образом, класс — это более сложная и мощная структура, чем просто функция. Классы позволяют создавать объекты с состоянием и поведением, что делает их особенно полезными в объектно-ориентированном программировании.
Что такое конструктор?
Это специальный метод, который вызывается при создании объекта и используется для инициализации свойств
Расскажи про статические переменные и методы. Что в них особенного? Когда используются. Напиши пример.
Статические переменные и методы принадлежат самому классу, а не объектам этого класса.
Это значит, что они общие для всех объектов данного класса и могут вызываться без создания объекта.
class Counter {
static int count = 0; // Статическая переменная
static void increment() { // Статический метод
count++;
}
}
void main() {
Counter.increment(); // Вызываем метод без создания объекта
print(Counter.count); // Вывод: 1
}
Статические методы и переменные полезны в ситуациях, когда необходимо иметь одно общее состояние или поведение для всех объектов класса, а не для каждого объекта отдельно.
Статические переменные полезны для хранения данных, которые остаются неизменными и доступны всем объектам класса. Например, в классе можно хранить информацию, общую для всех его объектов, такую как параметры конфигурации или единицы измерения.
class Earth {
static const double gravity = 9.8; // Константа, общая для всех объектов класса
}
void main() {
print(Earth.gravity); // Вывод: 9.8
}
Можно ли обновлять значение статической переменной извне?
При каких условиях?
Да, можно обновить значение статической переменной, как любой другой переменной, если она не объявлена как final или const.
Но лучше сделать её приватной и контролировать с помощью геттеров и сеттеров.
В чём разница между final и const?
В Dart оба ключевых слова, final и const, используются для создания неизменяемых значений (констант), НО они отличаются в том, как и когда эти значения присваиваются.
final (окончательное значение)
Присваивается один раз: Переменной, объявленной с ключевым словом final, можно присвоить значение только один раз. Это значение может быть вычислено в момент выполнения программы. Инициализация во время выполнения: Переменная final инициализируется один раз при первом доступе к ней. Значение может быть результатом сложных вычислений или зависеть от условий выполнения программы.
void main() {
final currentTime = DateTime.now(); // Значение присваивается во время выполнения
print(currentTime); // Выводит текущее время
}
const (константа)
Компиляция: Переменные, объявленные с const, должны быть неизменяемыми на этапе компиляции. Это означает, что значение должно быть известно и присвоено до начала выполнения программы. Фиксированное во времени: Значение, присвоенное переменной const, должно быть абсолютно фиксированным и неизменяемым. Оно не может зависеть от данных, которые вычисляются в процессе выполнения программы.
void main() {
const pi = 3.14159; // Значение известно заранее
print(pi); // Вывод: 3.14159
}
Здесь pi — это константа, которая известна заранее и фиксирована в коде, так как её значение не меняется во время выполнения программы.
Таким образом, final позволяет создавать переменные, которые можно инициализировать во время выполнения программы, а const требует, чтобы значение было известно и неизменно на этапе компиляции.
(в конце Урока 5)
Чем отличаются от обычных классов. Напиши синтаксис.
Абстрактные классы могут содержать абстрактные методы, которые не имеют реализации. Эти методы должны быть реализованы в подклассах.
Абстрактные методы не имеют тела (фигурных скобок)
abstract class Animal {
void makeSound(); // абстрактный метод
}
Опиши реализацию абстрактного класса в подкласса.
Подклассы абстрактного класса должны реализовать все абстрактные методы.
Если какой-то метод не реализован, то сам подкласс также должен быть объявлен как абстрактный.
abstract class Animal {
void makeSound(); // абстрактный метод
}
class Dog extends Animal {
@override
void makeSound() {
print(‘Woof!’);
}
}
Зачем нужны абстрактные классы?
Абстрактные классы используются для создания базовых классов.
Основная цель абстрактных классов — задать общий интерфейс для классов-потомков и обеспечить, чтобы в этих классах были определены конкретные реализации методов.
Абстрактные классы служат шаблоном для других классов, которые должны реализовать их методы и свойства.
Стандартизация: Они позволяют создавать шаблоны для будущих классов, гарантируя, что все потомки будут иметь определенные методы или свойства.
Кодовая организация: Абстрактные классы помогают группировать общие функции или поведение, чтобы не дублировать код.
Интерфейсы и полиморфизм: Абстрактные классы позволяют реализовать полиморфизм — когда объекты разных классов могут использоваться единообразно благодаря общей структуре.
abstract class Animal {
void makeSound();
}
class Cat extends Animal {
@override
void makeSound() {
print(‘Meow!’);
}
}
class Dog extends Animal {
@override
void makeSound() {
print(‘Woof!’);
}
}
void main() {
Animal myDog = Dog();
Animal myCat = Cat();
myDog.makeSound(); // Выведет: Woof!
myCat.makeSound(); // Выведет: Meow!
}