首頁 >後端開發 >Golang >如何定義帶有屬性的介面?

如何定義帶有屬性的介面?

PHPz
PHPz轉載
2024-02-10 22:30:09713瀏覽

如何定義帶有屬性的介面?

php小編魚仔將為大家介紹如何定義有屬性的介面。在PHP中,介面是一種約定,用來定義類別應該實作的方法。然而,有時候我們也需要在介面中定義屬性。要定義具有屬性的接口,我們可以使用常數來模擬屬性,並在實作接口的類別中進行賦值。這樣,我們就可以在介面中定義和使用屬性了。接下來,讓我們來看看具體的實作方法。

問題內容

我有一個問題:是否可以為線性空間設定介面?

讓我提醒一下,在線性空間l中,存在元素相加和元素乘以數字的運算。此外,還滿足兩個屬性:

1)l 中的 a b

2)l 中的ak,其中 k - 標量

我以以下形式呈現了線性空間的介面:

type Point interface {
}

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

如何在介面定義中考慮上述兩個屬性?

解決方法

介面只能包含方法。

你可以這樣做:

// 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

這就是「oop」在 go 中的工作原理。

以上是如何定義帶有屬性的介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除