-2

Web サービスに次の 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;

However, it tells me that file.base64Data is null. Why? I thought I overrided the sub class already.

4

2 に答える 2

1

そもそもなぜプロパティをオーバーライドするのでしょうか。あなたはOOPの概念を破っています。public フィールド '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 の概念に従えば、これはあなたのコードであり、問​​題なく動作するはずです。

そして、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

基本クラスに -memberAllFileが含まれていないdataため、アクセスできません! メンバーをプロパティとして宣言virtualし、サブクラスで、基本クラスに存在しない新しいメンバーを提供します。したがって、基本クラスでメンバーを仮想としてマークしないでください

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