设计Windows独立于图形软件平台时遇到了一个问题。我要求每个窗口都实现一个Launch()函数,并具有一个大小。
我当前的解决方案是一个名为BaseWindow的结构,该结构嵌入了Size以及一个名为Window的带有Launch()和GetSize()的接口。例如,OpenGLWindow随后将嵌入BaseWindow并使用openGL调用实现Launch()。我觉得这是不正确的,因为有一些代码异味。 A)我不喜欢它必须被称为GetSize()。但是,如果我将其称为Size(),它将与BaseWindow中嵌入的size结构的Size字段冲突。 B)接口应该独立于实现,但是这些获取器非常接近于强制实现。
最后,我希望有一个类型的Window可以传递和使用,而不必担心它在哪个平台上的实现。
// What I have
type Size struct {
Width int
Height int
}
// What I would like to be my type that I use to access these functions/members
type Window interface {
GetSize() Size
Launch() error
}
// This would have more things in the final application, but for simplicity
// I only included Size
type BaseWindow struct {
Size
}
// Example of what I want my end result to look like
type OpenGLWindow {
BaseWindow
}
func (window OpenGLWindow) Launch() {
// Do stuff
}
// Notice Window returns size of BaseWindow and uses Launch of OpenGLWindow
func SetGlobalWin(window Window) {
GlobalWin = window
CirclePositionX = window.GetSize().Width / 2
window.Launch()
}
// If using openGL, open openGL window and use that as primary window
func UseMyWindow() {
glwin := NewOpenGLWindow()
SetGlobalWin(glwin)
}
尽管这种方法可行,但由于上述原因,它似乎不是一个好的解决方案。我有一种感觉,我正在尽力使Launch()充当oop的虚拟函数,并且缺少Go的更多基于组合的方法的一些基本设计模式。