Tôi đang làm việc để lập trình trình phát phương tiện cơ bản và tôi gặp một số sự cố khi viết mã đa hình, đó là điều tôi đã nghiên cứu, nhưng chưa bao giờ thực sự được triển khai trước đó.Đa hình: Bắt nguồn từ một thành viên được bảo vệ trong một lớp cơ sở?
Có bốn lớp liên quan: MediaInfo, MovieInfo, Media và Movie.
MediaInfo là lớp cơ sở trừu tượng chứa thông tin liên quan đến tất cả các tệp phương tiện. MovieInfo kế thừa từ MediaInfo và thêm một số thông tin cụ thể cho tệp video.
Phương tiện là lớp cơ sở trừu tượng đại diện cho tất cả các tệp phương tiện. Phim được thừa hưởng từ Phương tiện.
Bây giờ, truyền thông bao gồm các dòng mã sau đây:
protected MediaInfo info;
Bên Media, Tôi có Accessors đó trích xuất thông tin từ MediaInfo. Tuy nhiên, bên trong Movie, tôi muốn có Accessors cũng trích xuất thông tin từ MovieInfo.
Vì vậy, những gì tôi đã làm trong phim là:
protected MovieInfo info;
Và bên trong constructor:
this.info = new MovieInfo(path);
Tuy nhiên, bây giờ tôi có một accessor:
/// <summary>
/// Gets the frame height of the movie file.
/// </summary>
public string FrameHeight
{
get
{
return this.info.FrameHeight;
}
}
Vấn đề là, FrameHeight là một accessor chỉ có sẵn bên trong MovieInfo. this.info được coi là một MediaInfo, mặc dù thực tế là tôi đã khai báo nó như là một MovieInfo, và do đó mã tạo ra một lỗi.
Vì vậy, để tổng hợp vấn đề của tôi thành một câu hỏi chung chung hơn: Trong một lớp dẫn xuất, làm thế nào để tôi lấy được từ một biến cơ sở được bảo vệ trong lớp cơ sở?
Xin lỗi nếu điều này có chút khó hiểu, tôi rất sẵn lòng làm rõ mọi chi tiết không rõ ràng.
@Daniel - Tôi nghĩ generics là giải pháp duy nhất (loại an toàn) cho cấu trúc bạn đã cung cấp. Bạn có thể làm điều đó theo cách không chung chung nếu bạn có thể di chuyển trường 'info' ra khỏi lớp' MovieInfo' và vào các lớp con của nó. – Lee