覆盖派生类中的构造函数,由超类'定义。接口

时间:2016-07-24 15:01:42

标签: c# inheritance interface

结构

班级B扩展了班级AA实现了接口ISerializable

ISerializable定义了一个构造函数:

public A(SerializationInfo info, StreamingContext ctxt)

我需要在B中编写这个构造函数的特定实现。

我试过简单地将构造函数放在B中 - 但它不会被调用。 我似乎无法覆盖它。

简化问题

因此始终会调用A(SerializationInfo info, StreamingContext ctxt)而不是B(SerializationInfo info, StreamingContext ctxt) : base(info, ctxt)

new Base()不会致电new Derived()

调用(错误)构造函数的代码:

更新

  • 对象被视为A的对象 - 可能是问题!

更新

List<A> list = new List<A>();
list.Add(New B());
string s = JsonConvert.SerializeObject(list);    
JsonConvert.DeserializeObject<List<A>>(s); <--- //it is called from here.

解决这个继承问题的任何想法?

详情

public class A: ISerializable
{
public A(int id, string name, string type, string category, string description, string data)
        {
            this.Id = id;
            this.Name = name;
            this.Type = type;
            this.Category = category;
            this.Description = description;
            this.Data = data;
        }

 protected A(SerializationInfo info, StreamingContext ctxt)
        {
            Id = (int)info.GetValue("id", typeof(int));
            Name = (String)info.GetValue("name", typeof(string));
            Type = (String)info.GetValue("type", typeof(string));
            Category = (String)info.GetValue("category", typeof(string));
            Description = (String)info.GetValue("description", typeof(string));
            Data = (String)info.GetValue("data", typeof(string));
        }
}

public class B : A
{

public B(int id, string name, string type, string category, string description, string data) : base(id, name, type, category, description, data)
            {
               // specific B code
            }

 protected B(SerializationInfo info, StreamingContext ctxt) : base(info, ctxt){
    // THIS NEVER GETS CALLED   
   // specific B code
}


}

1 个答案:

答案 0 :(得分:0)

这可以帮助您在您的案例中调用派生类中的一些代码。它只是试图给你一个选择。在不知道背景的情况下,我无法做出判断。 Also check out what is virtual member call

您可以在A中定义虚拟方法,在A(SerializationInfo info,StreamingContext ctxt)中调用它。

public class A : ISerializable
{
    public A(string name)
    {
    }

    public virtual void Foo()
    {
    }

    protected A(SerializationInfo info, StreamingContext ctxt)
    {
        Foo();
    }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
    }
}

然后在B中复制/将一些逻辑移入覆盖方法。当A(SerializationInfo info,StreamingContext ctxt)被调用时,B&#39; Foo()也会被调用。

public sealed class B : A
{
    public B(string name) : base(name)
    {
    }

    public override void Foo()
    {
        Tag = "B";
    }

    public string Tag { get; set; }

    protected B(SerializationInfo info, StreamingContext ctxt) : base(info, ctxt)
    {
    }
}