0.作业要求
1.类型设计与实现
Widget(接口): 所有的组件都应实现 Draw 方法。一般组件只需要渲染组件本身即可,容器组件要渲染自己,同时渲染自己的子组件
Container: 所有容器组件的父类,实现 Widget 接口的同时,定义了 Add 方法,将子组件添加至容器
Window 和 Frame: 继承自 Container。Draw 方法为先渲染自身,再调用父类 Draw 方法渲染子组件
NormalWidget: 只需渲染自己的组件,包括 Label, CheckBox, Input 等。
// ##########接口与基类##########
type Widget interface { Draw()}
type Container struct { Widgets *[]Widget}
func (c Container) Draw() {
for _, w := range *c.Widgets {
w.Draw()
}
}
func (c *Container) Add(w Widget) { c.Widgets = append(c.Widgets, w)}
// ##########容器实现类##########
type WinForm struct { Name string Container}
func (w WinForm) Draw() { println("print WinForm(" + w.Name + ")") w.Container.Draw()}
type Frame struct { Name string Container
}
func (f Frame) Draw() { println("print Frame(" + f.Name + ")") f.Container.Draw()}
// ##########普通组件类##########
type Picture string
func (p Picture) Draw() { println("print Picture(" + p + ")")}
type CheckBox string
func (c CheckBox) Draw() {
println("print CheckBox(" + c + ")")
}
type PasswordBox string
func (p PasswordBox) Draw() { println("print TextBox(" + p + ")")}
type Button string
func (b Button) Draw() { println("print Button(" + b + ")")}
type Label string
func (l Label) Draw() { println("print Label(" + l + ")")}
type LinkLabel string
func (l LinkLabel) Draw() { println("print LinkLabel(" + l + ")")}
type TextBox string
func (t TextBox) Draw() { println("print TextBox(" + t + ")")}
复制代码
2.main 方法与执行结果
func main() { window := WinForm{ Name: "Window窗口", Container: Container{Widgets: &[]Widget{}}, }
frame := Frame{ Name: "FRAME1", Container: Container{Widgets: &[]Widget{}}, }
// window关联子组件 { picture := Picture("LOGO图片") window.Add(picture) buttonLogin := Button("登录") window.Add(buttonLogin) buttonRegister := Button("注册") window.Add(buttonRegister) window.Add(frame) }
// frame关联子组件 { labelUserName := Label("用户名") frame.Add(labelUserName) textBox := TextBox("文本框") frame.Add(textBox) labelPassword := TextBox("密码") frame.Add(labelPassword) checkBox := CheckBox("复选框") frame.Add(checkBox) labelRememberUser := Label("记住用户名") frame.Add(labelRememberUser) linkLabel := LinkLabel("忘记密码") frame.Add(linkLabel) }
window.Draw()}
复制代码
评论