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()
}
复制代码
评论