package studentsystem
import std.convert.*
/**
 * 成绩 类
 *
 * 仅保存学生学号(studentId)与课程 ID(courseId)两个"外键式"标识字段,
 * 以及成绩数值(value),体现模块间低耦合的设计思想。
 */
public class Score <: ToString {

    /**
     * 主构造函数
     *
     * @param studentId 学生学号
     * @param courseId  课程 ID
     * @param value     成绩(0 ~ 100)
     */
    public Score(
        private let studentId: UInt32,
        private let courseId: UInt32,
        private var value: Float32
    ) {}

    // 成员属性 propStudentId(只读)
    prop propStudentId: UInt32 {
        get() {
            studentId
        }
    }

    // 成员属性 propCourseId(只读)
    prop propCourseId: UInt32 {
        get() {
            courseId
        }
    }

    // 成员属性 propValue(可读写)
    mut prop propValue: Float32 {
        get() {
            value
        }
        set(value) {
            this.value = value
        }
    }

    /**
     * 输出成绩信息(ToString 接口定义的转换字符串的函数)
     */
    public func toString() {
        "学号: ${studentId} 课程ID: ${courseId} 成绩: ${value.format(".1")}"
    }

    /**
     * 输出详细成绩信息(含学生姓名和课程名,需传入查找结果)
     *
     * @param studentName 学生姓名(从 StudentManager 查找得到)
     * @param courseName  课程名称(从 CourseManager 查找得到)
     */
    func toDetailString(studentName: String, courseName: String) 
    {
        "学号: ${studentId}(${studentName}) 课程: ${courseId}(${courseName}) 成绩: ${value.format(".1")}"
    }
}