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为空。为什么?我以为我已经重写了子类。
你的基类AllFile
不包含data
成员,所以你不能访问它!你声明了你的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;