c#继承和多态性

本文关键字:多态性 继承 | 更新日期: 2023-09-27 18:06:36

我的web服务中有这两个类:

[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;

但是,它告诉我那个文件。base64Data为空。为什么?我以为我已经重写了子类。

c#继承和多态性

你的基类AllFile不包含data成员,所以你不能访问它!你声明了你的virtual成员作为一个属性,并在你的子类中提供了一个不存在于你的基类中的新成员。所以不要在基类

中将成员标记为virtual
[DataContract]
public class AllFile
{
    [DataMember(IsRequired = true)]
    public string base64Data { get; set; }
}

为什么首先要重写该属性?你正在打破面向对象的概念。你有一个公共字段data你从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的概念,这应该是你的代码,它应该工作得很好。

如果我们更遵循面向对象的概念,这应该是你的代码:

[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;