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 中的工作原理。
以上就是如何定义带有属性的接口?的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!