vấn đề của tôi là như sau. Tôi đã thực hiện một thiết kế mã cho một dự án nhà mà dường như không hoạt động. Có lẽ bạn có thể giúp tôi tìm ra nơi "mùi mã" xuất phát từ đó.Tuyên bố về biến kiểu chung trừu tượng
Ok chúng ta hãy bắt đầu: tôi đã xác định một số lớp học để quấn xung quanh loại khác nhau của các loại lưu trữ:
public abstract class Archive { }
public class ZipArchive : Archive { }
public class TarArchive : Archive { }
Để xử lý với những tài liệu lưu trữ, tôi định nghĩa lớp Manager. trong đó trừu tượng định nghĩa các hành vi cần thiết,
public abstract class ArchiveManager<T> where T : Archive
{
public abstract void OpenArchive(T archive);
}
Và những người cụ thể, mà thực sự thực hiện behaiour cụ thể:
public class ZipArchiveManager : ArchiveManager<ZipArchive>
{
public override void OpenArchive(ZipArchive archive) { /* .. */ }
}
public class TarArchiveManager : ArchiveManager<TarArchive>
{
public override void OpenArchive(TarArchive archive) { /* .. */ }
}
gì xảy ra bây giờ là trong thời gian biên dịch, tôi không biết đó loại lưu trữ Tôi sẽ xử lý, vì vậy tôi đã thử các cách sau:
class Program
{
static void Main(string[] args)
{
ArchiveManager<Archive> archiveManager = null;
if (/*some condition*/) {
archiveManager = new ZipArchiveManager();
}
else {
archiveManager = new TarArchiveManager();
}
}
}
kết thúc bằng lỗi sau:
Cannot implicitly convert type 'ZipArchiveManager' to 'ArchiveManager'
Theo tôi hiểu, đối số chung không thể được chuyển đổi hoàn toàn. Có cách nào để giải quyết vấn đề này không? Mã/thiết kế này có "mùi" không?
Cảm ơn bạn rất nhiều trước.
Tạo lớp cơ sở không chung chung hoặc sử dụng giao diện covariant. – CodesInChaos
Ngoài ra, chữ ký của 'OpenArchive' có vẻ sai với tôi. Không nên nó nhận được một dòng, và trả về 'T'? – CodesInChaos