Как определить интерфейс со свойствами?

У меня вопрос: можно ли задать интерфейс для линейного пространства?

Напомню, что в линейном пространстве L есть операция сложения элементов и умножения элемента на число. При этом выполняются два свойства:

1)а+б в л

2)ak в L, где k - скаляр

Я представил интерфейс для линейного пространства в следующем виде:

type Point interface {
}

type LinSpace interface {
    Sum(x, y Point)
    Prod(x Point, k float64)
}

как я могу учесть два вышеуказанных свойства в определении интерфейса?

Можете ли вы показать пример того, как вы хотели бы использовать интерфейс?

Hymns For Disco 30.03.2023 02:37

Я использовал это как вымышленный пример интерфейса, реальной пользы от него нет. Мне стало интересно, можно ли как-то наложить на интерфейс свойства, а не только определения методов.

vovanchello 30.03.2023 02:41
applygo.com/blog/generic-interface-functions выглядит многообещающе
Ry- 30.03.2023 02:51

Похоже, вы не упомянули какие-либо свойства (за исключением того, что эти два метода должны существовать, что является нормальным использованием интерфейсов). Вы имеете в виду, что существует какое-то конкретное математическое соотношение, которому должен удовлетворять интерфейс? Если это так, вы не можете применить это с помощью системы типов Go.

Hymns For Disco 30.03.2023 02:53

Интерфейсы не могут иметь полей. У них могут быть только методы. Если необходимо, добавьте геттеры и сеттеры. Или используйте тип структуры вместо типа интерфейса.

icza 30.03.2023 10:30
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
0
5
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Интерфейсы могут содержать только методы.

Вы можете сделать что-то вроде этого:

    // Effective Go says: interface names should contain prefix -er 
    type LinSpacer interface {
        Sum() float64
        Prod(k float64) float64
    }
    
    // Struct that implements interface
    type LinSpaceImpl struct {
        A float64
        B float64
    }
    
    // Implementation of Sum() method
    // Also, You don't need to pass A and B vars
    // because they're already exist in LinSpaceImpl
    func (l *LinSpaceImpl) Sum() float64 {
        return l.A + l.B
    }
    
    // Implementation of Prod() method
    // Unlike the Sum() method, here we need extra param - k
    // So it has to be passed, or You can add it to
    // LinSpaceImpl as another fields but it doesn't
    // make any sense though
    func (l *LinSpaceImpl) Prod(k float64) float64 {
        return l.A * k
    }
    
    // Unnecessary "constructor" to optimize Your main function
    // And clarify code
    func NewLinSpace(a, b float64) LinSpacer {
    // Since LinSpaceImpl correctly implements LinSpacer interface
    // You can return instance of LinSpaceImpl as LinSpacer
        return &LinSpaceImpl{
            A: a,
            B: b,
        }
    }

И тогда вы можете сделать это в своей основной (или другой) функции:

    // Use any float values
    ls := NewLinSpace(11.2, 24.7)
    
    fmt.Println(ls.Sum())      // 35.9
    fmt.Println(ls.Prod(30.2)) // 338.23999999999995

Вот как работает «ООП» в Go.

Другие вопросы по теме