Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
1 / 1 / 0
Регистрация: 02.04.2022
Сообщений: 1

Множественное наследование

02.04.2022, 19:05. Показов 2812. Ответов 28

Студворк — интернет-сервис помощи студентам
Здравствуйте, объясните пожалуйста вкратце, что такое комбинирование методов в clos, что может стоять за понятием "обход соседей" и как работает call next method. Желательно объяснить как это работает в концепции множественного наследования и как в lisp разрешается проблема ромба
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.04.2022, 19:05
Ответы с готовыми решениями:

Теоретико-множественное объединение множеств элементов
мне нужно построить теоретико-множественное объединение множеств элементов. Я нашёл в этой теме подходящий ответ...

Множественное число для английского слова
Всем привет, помогите пож-та, не очень понимаю язык лисп но очень нужно.. стоит интерпретатор XLISP, используется чистый лисп или так...

Функция (f W), вычисляющая множественное число для английского слова
Задача:Множественное число большинства английских существительных получается путем добавления буквы "s" к форме единственного...

28
Заблокирован
05.04.2022, 12:23
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от korvin_ Посмотреть сообщение
Не достигается
Вот твой пример
Цитата Сообщение от korvin_ Посмотреть сообщение
Lisp
1
2
3
4
5
6
7
8
9
10
(defgeneric price (obj)
  :method-combination +)
(defclass jacket () ())
(defmehod price ((obj jacket))
  2.3)
(declass shorts () ())
(defmethod price ((obj shorts))
  1.5)
(defclass suit (jacket shorts) ())
(format t "~a~%" (price (make-instance 'suit)))
;; 3.8
Что тут происходит? Создаёшь два класса - жакет и шорты (странное сочетание) потом их цены складываются, потом создаётся класс костюм, который состоит из жакета и цена за костюм равна: цена жакет + цена шорты.
Если говорить о перегрузке операторов, то она как раз была создана для того, чтобы иметь возможность пользоваться стандартными операторами языка для своих типов. Перегрузив оператор, ты сможешь написать жакет + брюки и это будет равно цене костюма. Ты можешь определить функцию new, которая будет создавать новый тип suit который будет содержать в себе jackets и shorts и цену равную сумме этих элементов.
Цитата Сообщение от korvin_ Посмотреть сообщение
Когда покажешь как сделать функцию printWeights с помощью перегрузки операторов, тогда и будешь говорить, что достигается.
Я же спросил, а что там перегружать? Там нет никаких операторов. Ты просто печатаешь вектор объектов характеристики и всё.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
05.04.2022, 17:43
Цитата Сообщение от Гай Посмотреть сообщение
Создаёшь два класса - жакет и шорты (странное сочетание)
Да пофиг, пусть будет pants.

Цитата Сообщение от Гай Посмотреть сообщение
потом их цены складываются
Нет, не складываются.

Цитата Сообщение от Гай Посмотреть сообщение
потом создаётся класс костюм, который состоит из жакета и цена за костюм равна: цена жакет + цена шорты.
Да.

Цитата Сообщение от Гай Посмотреть сообщение
Если говорить о перегрузке операторов, то она как раз была создана для того, чтобы иметь возможность пользоваться стандартными операторами языка для своих типов.
Я в своём примере не использую + для своих типов.

Цитата Сообщение от Гай Посмотреть сообщение
Ты можешь определить функцию new, которая будет создавать новый тип suit который будет содержать в себе jackets и shorts и цену равную сумме этих элементов.
Но зачем мне это делать вручную, если с помощью метод-комбинаторов это делается автоматически?

Цитата Сообщение от Гай Посмотреть сообщение
Там нет никаких операторов.
Как и в моём примере.

Цитата Сообщение от Гай Посмотреть сообщение
Ты просто печатаешь вектор объектов характеристики и всё.
Ты видишь там метод CatDog::weight, который суммирует вес cat и dog и который ты предлагаешь делать перегрузкой операторов?

Добавлено через 15 минут
Ещё раз, вот этот пример:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
(defgeneric price (obj)
  (:method-combination +))
 
; ----------------------------------------------------------------
 
(defclass jacket () ())
 
(defmethod price + ((obj jacket))
  42)
 
; ----------------------------------------------------------------
 
(defclass pants () ())
 
(defmethod price + ((obj pants))
  9001)
 
; ----------------------------------------------------------------
 
(defclass suit (jacket pants) ())
 
; ----------------------------------------------------------------
 
(defun main ()
  (let ((jacket (make-instance 'jacket))
        (pants  (make-instance 'pants))
        (suit   (make-instance 'suit)))
    (dolist (obj (list jacket pants suit))
      (format t "~a~%" (price obj)))))
 
(main)
https://rextester.com/GNVA97270

полностью эквивалентен этому коду на Rust:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
use std::vec;
 
trait Priced {
    fn price(&self) -> u32;
}
 
// ----------------------------------------------------------------
 
struct Jacket {}
 
impl Priced for Jacket {
    fn price(&self) -> u32 {
        42
    }
}
 
// ----------------------------------------------------------------
 
struct Pants {}
 
impl Priced for Pants {
    fn price(&self) -> u32 {
        9001
    }
}
 
// ----------------------------------------------------------------
 
struct Suit {
    jacket: Jacket,
    pants:  Pants,
}
 
impl Priced for Suit {
    fn price(&self) -> u32 {
        self.jacket.price() + self.pants.price()
    }
}
 
// ----------------------------------------------------------------
 
fn main() {
    let jacket = Jacket{};
    let pants  = Pants{};
    let suit   = Suit{jacket: Jacket{}, pants: Pants{}};
    let mut goods : Vec<&Priced> = vec![&jacket, &pants, &suit];
    for obj in goods.iter() {
        println!("{}", obj.price());
    }
}
https://rextester.com/ITPL50873

с той лишь разницей, что в расте пришлось вручную реализовывать метод price для Suit, а в CLOS это сделано автоматически на основе комбинации методов.

Вот и всё, нигде никакой перегрузки операторов.
0
Заблокирован
05.04.2022, 19:06
Цитата Сообщение от korvin_ Посмотреть сообщение
Да пофиг, пусть будет pants.
trousers тогда уже
Цитата Сообщение от korvin_ Посмотреть сообщение
Нет, не складываются.
умножаются, делятся?
Цитата Сообщение от korvin_ Посмотреть сообщение
Я в своём примере не использую + для своих типов.
Цитата Сообщение от korvin_ Посмотреть сообщение
(defgeneric price (obj)

(:method-combination +))
А это что? минус?
Цитата Сообщение от korvin_ Посмотреть сообщение
Но зачем мне это делать вручную, если с помощью метод-комбинаторов это делается автоматически?
так ты реализуй трейт и будешь делать потом автоматически. так-то ты в своих примерах тоже логику действий
описываешь.
Цитата Сообщение от korvin_ Посмотреть сообщение
Как и в моём примере.
только не говори сейчас - "Это функция, это не оператор и тд"
+ в Rust - это тоже функция.
еще раз [quote="korvin_;16159389"](defgeneric price (obj)[\quote]
Цитата Сообщение от korvin_ Посмотреть сообщение
Ты видишь там метод CatDog::weight, который суммирует вес cat и dog и который ты предлагаешь делать перегрузкой операторов?
Вижу в своем примере.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
05.04.2022, 19:59
Цитата Сообщение от Гай Посмотреть сообщение
умножаются, делятся?
Нет.

Цитата Сообщение от Гай Посмотреть сообщение
А это что? минус?
Это не «для своих типов».

Цитата Сообщение от Гай Посмотреть сообщение
так ты реализуй трейт и будешь делать потом автоматически.
Какой трейт? Add? Мне не нужен Add. У меня есть список товаров разных классов, нужно пройтись по нему, и суммировать все цены. При этом для составных товаров цена определяется как сумма цен их компонентов.

Куда тут, по-твоему, нужно впихнуть Add?:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
use std::vec;
 
trait Priced {
    fn price(&self) -> u32;
}
 
struct Jacket {}
impl Priced for Jacket { fn price(&self) -> u32 { 1 } }
 
struct Pants {}
impl Priced for Pants { fn price(&self) -> u32 { 2 } }
 
struct Hat {}
impl Priced for Hat { fn price(&self) -> u32 { 3 } }
 
struct Shoes {}
impl Priced for Shoes { fn price(&self) -> u32 { 4 } }
 
struct Suit {
    jacket: Jacket,
    pants:  Pants,
}
impl Priced for Suit {
    fn price(&self) -> u32 { self.jacket.price() + self.pants.price() }
}
 
struct FullSuit {
    suit:  Suit,
    shoes: Shoes,
}
impl Priced for FullSuit {
    fn price(&self) -> u32 { self.suit.price() + self.shoes.price() }
}
 
struct ModernSuit {
    suit: Suit,
    hat:  Hat,
}
impl Priced for ModernSuit {
    fn price(&self) -> u32 { self.suit.price() + self.hat.price() }
}
 
struct ModernFullSuit {
    suit:  Suit,
    shoes: Shoes,
    hat:   Hat,
}
impl Priced for ModernFullSuit {
    fn price(&self) -> u32 { self.suit.price() + self.shoes.price() + self.hat.price() }
}
 
fn main() {
    let a = Jacket{};
    let b = Pants{};
    let c = Shoes{};
    let d = Hat{};
    let e = Suit{ jacket: Jacket{}, pants: Pants{} };
    let f = FullSuit{ suit: Suit{ jacket: Jacket{}, pants: Pants{} }, shoes: Shoes{} };
    let g = ModernSuit{ suit: Suit{ jacket: Jacket{}, pants: Pants{} }, hat: Hat{} };
    let h = ModernFullSuit{ suit: Suit{ jacket: Jacket{}, pants: Pants{} }, shoes: Shoes{}, hat: Hat{} };
 
    let goods: std::vec::Vec<&dyn Priced> = vec![&a, &b, &c, &d, &e, &f, &g, &h];
    for item in goods.iter() {
        println!("{}", item.price());
    }
}
https://rextester.com/RTVL59801
0
Заблокирован
05.04.2022, 21:13
Цитата Сообщение от korvin_ Посмотреть сообщение
У меня есть список товаров разных классов
а нахера создавать для товаров классы?

Добавлено через 14 минут
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use std::ops::Add;
 
 
struct Trousers {
    price: u16
} 
 
 
struct Jacket {
    price: u16
}
 
 
impl Add<Jacket> for Trousers {
    
    type Output = u16;
    
    fn add(self, other: Jacket) -> u16 {
        
        let sum = self.price + other.price;
        
        sum
    }
}
 
 
struct Suit {
    
    trousers: Trousers,
    jacket: Jacket
    
}
 
 
impl Suit {
    
    fn new() -> Self {
        
        Self {
            
            trousers: Trousers {
                price: 10
            },
            
            jacket: Jacket {
                price: 20
            }
            
            
        }
        
    }
    
    
    fn price(self) -> u16 {
        
        let sum = self.trousers + self.jacket;
        
        sum
    }
}
 
 
 
fn main() {
     
    let suit = Suit::new();
     
    println!("Цена за костюм: {} золотых", suit.price());
}
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
05.04.2022, 21:59
Цитата Сообщение от Гай Посмотреть сообщение
а нахера создавать для товаров классы?
Затем, что это разные товары.

Цитата Сообщение от Гай Посмотреть сообщение
Code
1
impl Add<Jacket> for Trousers
Ты ещё забыл
Code
1
2
3
4
5
6
7
8
impl Add<Jacket> for Jacket
impl Add<Jacket> for Suit
impl Add<Trousers> for Trousers
impl Add<Trousers> for Jacket
impl Add<Trousers> for Suit
impl Add<Suit> for Jacket
impl Add<Suit> for Trousers
impl Add<Suit> for Suit
Code
1
2
3
4
5
6
fn main() {
     
    let suit = Suit::new();
     
    println!("Цена за костюм: {} золотых", suit.price());
}
а теперь создай список разнотипных товаров: пиджаки, брюки, костюмы и просуммируй цену.

Цитата Сообщение от Гай Посмотреть сообщение
Code
1
2
3
4
5
6
    fn price(self) -> u16 {
        
        let sum = self.trousers + self.jacket;
        
        sum
    }
молодец, а теперь обойдись без этой функции.

И вот ещё:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct Trousers {
    price: u16,
    depreciation: u16
} 
 
 
struct Jacket {
    price: u16,
}
 
impl Add<Jacket> for Trousers {
    
    type Output = u16;
    
    fn add(self, other: Jacket) -> u16 {
        
        let sum = self.price + other.price;
        
        sum
    }
}
теперь сделай второй impl Add для амортизации.

Добавлено через 2 минуты
Ну и повтори мой пример с разной комплектацией костюмов со своим Add.

Добавлено через 22 минуты
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
(defgeneric cost (obj)
  (:method-combination +))
 
(defgeneric depreciation (obj)
  (:method-combination +))
 
; ----------------------------------------------------------------
 
(defclass jacket () ())
 
(defmethod cost + ((obj jacket))
  1)
 
(defmethod depreciation + ((obj jacket))
  0.25)
 
; ----------------------------------------------------------------
 
(defclass pants () ())
 
(defmethod cost + ((obj pants))
  2)
 
(defmethod depreciation + ((obj pants))
  0.1)
 
; ----------------------------------------------------------------
 
(defclass shoes () ())
 
(defmethod cost + ((obj shoes))
  3)
 
(defmethod depreciation + ((obj shoes))
  0.55)
 
; ----------------------------------------------------------------
 
(defclass hat () ())
 
(defmethod cost + ((obj hat))
  4)
 
(defmethod depreciation + ((obj hat))
  0)
 
; ----------------------------------------------------------------
 
(defclass suit (jacket pants) ())
(defclass full-suit (suit shoes) ())
(defclass modern-suit (suit hat) ())
(defclass modern-full-suit (suit shoes hat) ())
 
; ----------------------------------------------------------------
 
(defun main ()
  (let ((storage
         (list
          (make-instance 'jacket)
          (make-instance 'pants)
          (make-instance 'shoes)
          (make-instance 'hat)
          (make-instance 'suit)
          (make-instance 'full-suit)
          (make-instance 'modern-suit)
          (make-instance 'modern-full-suit))))
   (format t "~20a   ~12a   ~12a   ~12a~%" "type" "cost" "depreciation" "price")
   (format t "----------------------------------------------------------------~%")
   (loop :for item :in storage
         :do (let ((cost (cost item))
                   (depr (depreciation item)))
               (format t "~20a:   ~10,2f   ~10,2f   ~10,2f~%" (type-of item) cost depr (+ cost depr)))
         :sum (cost item) :into total-cost
         :sum (depreciation item) :into total-depr
         :finally
         (format t "----------------------------------------------------------------~%")
         (format t "~20a:   ~10,2f   ~10,2f   ~10,2f~%" "Total" total-cost total-depr (+ total-cost total-depr)))))
 
(main)
=>
Code
1
2
3
4
5
6
7
8
9
10
11
12
type                   cost           depreciation   price       
----------------------------------------------------------------
JACKET              :         1.00         0.25         1.25
PANTS               :         2.00         0.10         2.10
SHOES               :         3.00         0.55         3.55
HAT                 :         4.00         0.00         4.00
SUIT                :         3.00         0.35         3.35
FULL-SUIT           :         6.00         0.90         6.90
MODERN-SUIT         :         7.00         0.35         7.35
MODERN-FULL-SUIT    :        10.00         0.90        10.90
----------------------------------------------------------------
Total               :        36.00         3.40        39.40
https://rextester.com/UZXI47819

Покажи, как ты тут Add воспользуешься.
1
Заблокирован
05.04.2022, 22:57
Цитата Сообщение от korvin_ Посмотреть сообщение
Затем, что это разные товары.
И что с того? Можно спокойно обойтись без классов. Хеш-таблица будет куда удобнее и лучше.
Цитата Сообщение от korvin_ Посмотреть сообщение
Ты ещё забыл
Конечно, это гораздо упростит разработку программы в дальнейшем. для этого эти возможности и существуют.
Есть такой учебник по Clojure - программирование на Clojure Чаз Эмерик.
Там есть несколько страниц посещённых ассоциативным массивам. Открой и почитай. Там ты увидишь что, представленный тобой вывод по товарам занимает ровно одну функцию.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
05.04.2022, 23:08
Цитата Сообщение от Гай Посмотреть сообщение
Хеш-таблица будет куда удобнее и лучше.
Чем?

Цитата Сообщение от Гай Посмотреть сообщение
Там есть несколько страниц посещённых ассоциативным массивам. Открой и почитай. Там ты увидишь что, представленный тобой вывод по товарам занимает ровно одну функцию.
Ты, видимо, не можешь абстрагироваться от конкретики. И дай угадаю: в этой функции нет никакой перегрузки оператора +? )
0
Заблокирован
05.04.2022, 23:18
Цитата Сообщение от korvin_ Посмотреть сообщение
Чем?
тем, что тебе не нужно создавать классы, прописывать методы, определять наследования и прочую лабуду.
Цитата Сообщение от korvin_ Посмотреть сообщение
дай угадаю: в этой функции нет никакой перегрузки оператора +? )
там нет классов. открой и почитай. у меня тор что-то не грузит страницу, а то бы я зашёл на рутрекер, скачал книжку и продемонстрировал.

Добавлено через 2 минуты
Цитата Сообщение от korvin_ Посмотреть сообщение
Ты, видимо, не можешь абстрагироваться от конкретики.
Вообще по крутости реализации Clojure на высоте. Очень богатый язык в плане возможностей, которые тебе дают результат при наименьших энергозатратах на написание кода. Всё перечёркивает то, что это работает на jvm
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.04.2022, 23:18

Множественное число английских существительных
Всем привет, буду благодарен если кто-то поможет с решением задачи. Задача - Множественное число большинства английских существительных...

Множественное наследование
Есть два класса Human(fname, lname) и класс Employee c чисто виртуальными функц (зарплата и печать). На базе этих классов нужно создать...

Множественное наследование
Создать иерархии наследования: телевизор, цифровое устройство - монитор. Создать динамический массив объектов, инициализировать его. Сам...

Множественное наследование
Если абстрактный класс A: class A { ...... public: virtual void display(); } От него наследуется класс B:

множественное наследование
Почему не компилируется код? #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; using namespace std; class...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ начало и оглавление - Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru