kết cấu
类 B
Lớp mở rộng MỘT
.MỘT
thực hiện giao diện Có thể tuần tự hóa được
Có thể tuần tự hóa được
Một hàm tạo được định nghĩa:
công khai A(thông tin SerializationInfo, StreamingContext ctxt)
我需要在 B
Viết cách triển khai cụ thể của hàm tạo này trong .
Tôi đã thử đơn giản là đặt hàm tạo vào B
trong - nhưng nó sẽ không được gọi. Tôi dường như cũng không thể ghi đè lên nó.
vấn đề đơn giản hóa
所以 A(Thông tin SerializationInfo, StreamingContext ctxt)
luôn được gọi thay vì B(Thông tin SerializationInfo, StreamingContext ctxt): base(info, ctxt)
.
hoặc
newBase()
Không được gọi newDerived()
Mã gọi hàm tạo (sai):
gia hạn
- Đối tượng được coi là đối tượng của A - đây có thể là vấn đề!
gia hạn
Danh sách list = Danh sách mới();
list.Add(New B());
chuỗi s = JsonConvert.SerializeObject(danh sách);
JsonConvert.DeserializeObject<>>(s); <--- //nó được gọi từ đây.
Bất kỳ ý tưởng nào để giải quyết vấn đề thừa kế này?
Chi tiết
lớp công khai A: ISerializable
{
public A(int id, tên chuỗi, loại chuỗi, danh mục chuỗi, mô tả chuỗi, dữ liệu chuỗi)
{
cái này.Id = id;
this.Name = tên;
cái này.Type = loại;
this.Category = danh mục;
this.Description = mô tả;
this.Data = dữ liệu;
}
được bảo vệ A (Thông tin SerializationInfo, StreamingContext ctxt)
{
Id = (int)info.GetValue("id", typeof(int));
Tên = (Chuỗi)info.GetValue("name", typeof(string));
Gõ = (String)info.GetValue("type", typeof(string));
Category = (String)info.GetValue("category", typeof(string));
Mô tả = (Chuỗi)info.GetValue("mô tả", typeof(string));
Dữ liệu = (Chuỗi)info.GetValue("data", typeof(string));
}
}
công khai hạng B :A
{
public B(int id, tên chuỗi, loại chuỗi, danh mục chuỗi, mô tả chuỗi, dữ liệu chuỗi): base(id, tên, loại, danh mục, mô tả, dữ liệu)
{
// mã B cụ thể
}
được bảo vệ B(Thông tin SerializationInfo, StreamingContext ctxt): base(info, ctxt){
// ĐIỀU NÀY KHÔNG BAO GIỜ ĐƯỢC GỌI
// mã B cụ thể
}
}
Điều này sẽ giúp bạn gọi một số mã trong lớp dẫn xuất trong trường hợp của bạn. Nó chỉ cố gắng cho bạn một sự lựa chọn. Không biết bối cảnh, tôi không thể đưa ra phán xét. Ngoài ra, hãy xem cuộc gọi thành viên ảo là gì .
Bạn có thể xác định phương thức ảo trong A và gọi (thông tin SerializationInfo, StreamingContext ctxt) trong A.
lớp công khai A: ISerializable
{
công khai A(tên chuỗi)
{
}
khoảng trống ảo công khai Foo()
{
}
được bảo vệ A (Thông tin SerializationInfo, StreamingContext ctxt)
{
Foo();
}
public void GetObjectData(Thông tin SerializationInfo, bối cảnh StreamingContext)
{
}
}
Sau đó sao chép/di chuyển một số logic trong B sang phương thức được ghi đè. Khi A(SerializationInfo info, StreamingContext ctxt) được gọi, Foo() của B cũng sẽ được gọi.
niêm phong công khai loại B: A
{
công khai B(tên chuỗi): cơ sở(tên)
{
}
ghi đè công khai void Foo()
{
Thẻ = "B";
}
Thẻ chuỗi công khai { được đặt;
được bảo vệ B(Thông tin SerializationInfo, StreamingContext ctxt): base(info, ctxt)
{
}
}
Tôi là một lập trình viên xuất sắc, rất giỏi!