這是一個典型的 C# 物件導向程式設計作業,要求建立包含抽象基類、繼承關係、列舉約束、集合管理與序列化介面的完整類別體系。本文將需求拆解為可執行的程式碼模組,並說明關鍵設計決策。
Person (abstract)
├── Fields: Name, Height, Weight, Sex
├── Properties: ID (18碼驗證), Age (readonly)
├── Methods: Saying(), Write(), Read()
├── Constructors: default / parameterized
│
├── Teacher : Person
│ ├── Fields: Title(ProTitle), Courses(List<string>)
│ ├── Property: CourseNumber (readonly)
│ ├── Methods: CourseAdd(), CourseDelete()
│ └── Overrides: Saying(), ToString(), Write(), Read()
│
└── Student : Person
├── Fields: StuID, CourseScore(List<CourseScore>), Title(StuTitle)
├── Property: CourseNumber (readonly)
├── Methods: CourseAdd() overloads, GetScore(ref high, low, avg)
└── Overrides: Saying(), ToString(), Write(), Read()
public abstract class Person
{
protected string Name;
protected float Height, Weight;
protected SexType Sex;
private string _id = "999999999999999999";
public string ID
{
get => _id;
set { if (Regex.IsMatch(value, @"^\d{18}$")) _id = value; }
}
public int Age { get; protected set; }
public Person() { }
public Person(string name, string id, float h, float w, SexType s)
{ Name = name; ID = id; Height = h; Weight = w; Sex = s; }
public abstract void Saying();
public abstract void Write(FileStream fs);
public abstract void Read(FileStream fs);
}
public class Teacher : Person
{
public ProTitle Title { get; set; }
private readonly List<string> _courses = new List<string>();
public int CourseNumber => _courses.Count;
public string CourseAdd(string name)
{
if (_courses.Contains(name)) return "課程重複";
_courses.Add(name);
return "成功";
}
public string CourseDelete(string name)
=> _courses.Remove(name) ? "成功" : "找不到課程";
public override void Saying() => Console.WriteLine("我正在講課,不方便接電話");
public override string ToString() => $"[教師]{Name} {Title} 授課數:{CourseNumber}";
public override void Write(FileStream fs) { /* TODO */ }
public override void Read(FileStream fs) { /* TODO */ }
}
public struct CourseScore { public string CourseName; public float Score; }
public class Student : Person
{
public string StuID { get; set; }
public StuTitle Title { get; set; }
private readonly List<CourseScore> _scores = new List<CourseScore>();
public int CourseNumber => _scores.Count;
public void CourseAdd(string name, float score)
=> _scores.Add(new CourseScore { CourseName = name, Score = score });
public void CourseAdd(CourseScore cs) => _scores.Add(cs);
public override void Saying() => Console.WriteLine("我正在上課,不方便接電話");
public void GetScore(ref double high, ref double low, ref double avg)
{
if (_scores.Count == 0) { high = low = avg = 0; return; }
high = _scores.Max(x => x.Score);
low = _scores.Min(x => x.Score);
avg = _scores.Average(x => x.Score);
}
public override string ToString()
=> $"[學生]{Name} {StuID} {Title} 科目數:{CourseNumber} 平均:{_scores.Average(x => x.Score):F1}";
public override void Write(FileStream fs) { /* TODO */ }
public override void Read(FileStream fs) { /* TODO */ }
}