-2

我的网络服务中有这两个类:

[DataContract]
public class AllFile
{
    [DataMember(IsRequired = true)]
    public virtual string base64Data { get; set; }
}
[DataContract]
public class UploadFile : AllFile
{
    [DataMember(IsRequired = true)]
    public string data;

    [DataMember(IsRequired = true)]
    public override string base64Data { get { return data; } set { data = value; } }

}

ServiceReference.UploadFile obj = new ServiceReference.UploadFile();
obj.base64Data = "something";
AllFile file = (UploadFile)obj;

但是,它告诉我 file.base64Data 为空。为什么?我以为我已经覆盖了子类。

4

2 回答 2

1

你为什么要首先覆盖该属性。您正在打破 OOP 概念。您有一个公共字段“数据”,您可以从 base64Data 字符串中获取它的值。如果您要这样做,至少将“数据”设为私有。之后,将 value64Data 设置为基类中的普通属性并将其保留为简单的 {get;set;} 就足以让您的派生类也拥有它,并使所有这些设置变得毫无意义,并且在这种情况下不起作用。

DataContract]
public class AllFile
{
    [DataMember(IsRequired = true)]
    public string base64Data { get; set; }
}
[DataContract]
public class UploadFile : AllFile
{

}

ServiceReference.UploadFile obj = new ServiceReference.UploadFile();
obj.base64Data = "something";
AllFile file = (UploadFile)obj;

如果我们遵循 OOP 概念,这应该是您的代码,它应该可以正常工作。

如果我们更多地遵循 OOP 概念,这应该是您的代码:

[DataContract]
public class AllFile
{
    [DataMember(IsRequired = true)]
    public string base64Data { get; protected set; }
    public virtual void SetBase64Data(string data)
    {
        this.base64Data = data;
    }
}
[DataContract]
public class UploadFile : AllFile
{

}

ServiceReference.UploadFile obj = new ServiceReference.UploadFile();
obj.SetBase64Data("data");
AllFile file = (UploadFile)obj;
于 2013-03-31T11:35:58.323 回答
1

您的基类AllFile不包含data-member,因此您无法访问它!您将您的virtual成员声明为属性,并在您的子类中提供了一个新成员,该成员在您的基类中不存在。所以不要在你的基类中将你的成员标记为虚拟的

[DataContract]
public class AllFile
{
    [DataMember(IsRequired = true)]
    public string base64Data { get; set; }
}
于 2013-03-31T11:38:31.430 回答