Elementor Header #8

34. Цепочки вызовов методов

1. Введение

Цепочки вызовов методов (или методические цепочки) позволяют вызывать несколько методов последовательно, используя результаты предыдущих вызовов. Это удобный способ упрощения и улучшения читаемости кода, особенно когда нужно применить несколько операций к объекту. В этом уроке мы рассмотрим, как реализовать и использовать цепочки вызовов методов в C++.

2. Основы цепочек вызовов методов

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

Пример:

				
					class Calculator {
    public:
        Calculator& add(int value){
            result += value;
            return *this;
        }
    
        Calculator& subtract(int value){
            result -= value;
            return *this;
        }
    
        Calculator& multiply(int value){
            result *= value;
            return *this;
        }
    
        intgetResult()const{
            return result;
        }

    private:
        int result = 0;
};

				
			

В данном примере класс Calculator использует цепочки вызовов методов. Каждый метод возвращает ссылку на текущий объект (*this), что позволяет вызывать следующие методы в цепочке.

3. Примеры использования цепочек вызовов методов

Пример 1: Класс Calculator

				
					#include <iostream>

class Calculator {
    public:
        Calculator& add(int value){
            result += value;
            return *this;
        }
    
        Calculator& subtract(int value){
            result -= value;
            return *this;
        }
    
        Calculator& multiply(int value){
            result *= value;
            return *this;
        }
    
        intgetResult()const{
            return result;
        }

    private:
        int result = 0;
};

int main(){
    Calculator calc;
    int finalResult = calc.add(5).subtract(2).multiply(10).getResult();
    std::cout << "Результат вычислений: " << finalResult << std::endl; // Вывод: Результат вычислений: 30
    return 0;
}

				
			

В этом примере методы add, subtract и multiply вызываются последовательно, а результат вычислений получается с помощью метода getResult().

Пример 2: Класс StringBuilder

				
					#include <iostream>
#include <string>

class StringBuilder {
    public:
        StringBuilder& append(const std::string& str){
            result += str;
            return *this;
        }
    
        StringBuilder& toUpperCase(){
            for (char& ch : result) {
                ch = std::toupper(ch);
            }
            return *this;
        }
    
        StringBuilder& trim(){
            result.erase(0, result.find_first_not_of(" "));
            result.erase(result.find_last_not_of(" ") + 1);
            return *this;
        }
    
        std::string getResult()const{
            return result;
        }

    private:
        std::string result;
    };

int main(){
    StringBuilder builder;
    std::string finalString = builder.append("   hello   ").toUpperCase().trim().getResult();
    std::cout << "Результат: '" << finalString << "'" << std::endl; // Вывод: Результат: 'HELLO'
    return 0;
}

				
			

В данном примере класс StringBuilder позволяет строить строку, добавляя к ней подстроки, преобразовывая её в верхний регистр и удаляя пробелы по краям.

Заключение

Цепочки вызовов методов предоставляют мощный инструмент для упрощения и улучшения читабельности кода. Они позволяют последовательно применять несколько методов к объекту и могут значительно упростить работу с объектами, особенно когда требуется выполнить несколько операций. Важно помнить, что методы, поддерживающие цепочки вызовов, должны возвращать ссылку на текущий объект (*this), чтобы обеспечить возможность последовательного вызова методов.

5. Тестовое задание

Напишите класс Person, который будет поддерживать цепочки вызовов методов. Класс должен иметь методы для установки имени, возраста и города проживания. Методы должны возвращать ссылку на текущий объект, чтобы можно было вызывать их последовательно. Также добавьте метод printInfo(), который выводит информацию о человеке.

Примерный код:

				
					#include <iostream>
#include <string>

class Person {
    public:
        Person& setName(const std::string& name){
            this->name = name;
            return *this;
        }
    
        Person& setAge(int age){
            this->age = age;
            return *this;
        }
    
        Person& setCity(const std::string& city){
            this->city = city;
            return *this;
        }
    
        voidprintInfo()const{
            std::cout << "Имя: " << name << ", Возраст: " << age << ", Город: " << city << std::endl;
        }

    private:
        std::string name;
        int age = 0;
        std::string city;
};

int main(){
    Person person;
    person.setName("Иван").setAge(30).setCity("Москва").printInfo();
    return 0;
}

				
			

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

logo