Menu
CoddyTech

Ôn tập: hình dạng và hành vi

Thuộc phần Logic và luồng điều khiển trong hành trình GO của Coddy. Bài học 19 trên 68.

challenge icon

Thử thách

Dễ

Trong thử thách này, bạn sẽ tạo một hệ thống giao tiếp thể hiện tính đa hình (polymorphism) thông qua các giao diện (interface). Bạn sẽ xây dựng giao diện Speaker và triển khai giao diện này bằng các kiểu khác nhau, mỗi kiểu có cách "speak" riêng.

Bạn sẽ nhận ba đầu vào:

  • Một chuỗi biểu thị số lượng người nói cần tạo (ví dụ: "3")
  • Một chuỗi chứa các kiểu người nói, được phân tách bằng dấu phẩy (ví dụ: "person,parrot,person")
  • Một chuỗi chứa tên người nói, được phân tách bằng dấu phẩy (ví dụ: "Alice,Polly,Bob")

Nhiệm vụ của bạn là:

  1. Định nghĩa giao diện Speaker với một chữ ký phương thức: Speak(), trả về một chuỗi
  2. Định nghĩa cấu trúc Person với một trường Name (chuỗi)
  3. Định nghĩa cấu trúc Parrot với một trường Name (chuỗi)
  4. Triển khai phương thức Speak() cho cả hai cấu trúc:
    • Person cần trả về: "Hello, I'm [name]"
    • Parrot cần trả về: "Squawk! [name] says hello!"
  5. Tạo một hàm có tên makeAllSpeak, nhận một lát cắt các giao diện Speaker làm tham số
  6. Bên trong makeAllSpeak, lặp qua lát cắt, gọi phương thức Speak() trên từng người nói và in ra kết quả
  7. Phân tích các đầu vào để tạo các đối tượng người nói phù hợp dựa trên kiểu và tên đã cho
  8. Lưu tất cả người nói trong một lát cắt các giao diện Speaker
  9. Gọi makeAllSpeak với lát cắt người nói của bạn

Các người nói cần được tạo theo thứ tự xuất hiện trong đầu vào. Ví dụ: nếu các kiểu là "person,parrot,person" và tên là "Alice,Polly,Bob", hãy tạo một Person tên Alice, rồi một Parrot tên Polly, sau đó là một Person tên Bob. Thử thách này cho thấy các kiểu khác nhau có thể được xử lý thống nhất thông qua một giao diện chung, qua đó minh họa sức mạnh của tính đa hình trong Go.

Tự làm thử

package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
	// Đọc đầu vào
	var numSpeakersStr string
	var speakerTypesStr string
	var speakerNamesStr string
	
	fmt.Scanln(&numSpeakersStr)
	fmt.Scanln(&speakerTypesStr)
	fmt.Scanln(&speakerNamesStr)
	
	// Phân tích đầu vào
	numSpeakers, _ := strconv.Atoi(numSpeakersStr)
	speakerTypes := strings.Split(speakerTypesStr, ",")
	speakerNames := strings.Split(speakerNamesStr, ",")
	
	// TODO: Viết code của bạn bên dưới
	// 1. Định nghĩa interface Speaker
	// 2. Định nghĩa các struct Person và Parrot
	// 3. Triển khai phương thức Speak() cho cả hai struct
	// 4. Tạo hàm makeAllSpeak
	// 5. Tạo các đối tượng Speaker dựa trên đầu vào và lưu vào một slice
	// 6. Gọi makeAllSpeak với slice của bạn
	
}

Tất cả bài học trong Logic và luồng điều khiển

Tự luyện tập: Trình biên dịch Go online