0

私のコード:

public class Contact
{
    public string id{ get; set; }
    public string contact_type_id { get; set; }
    public string value{ get; set; }
    public string person_id { get; set; }
    public Contact()
    {

    }
}

public class Contact:Base.Contact
{
    public ContactType ContactType { get; set; }
    public Person Person {get; set;}
    public Contact()
    {
        ContactType = new ContactType();
        Person = new Person();
    }
}

と:

Contact c = new Contact();
Base.Contact cb = (Base.Contact)c;

問題:

The **cb** is set to **Contac** and not to **Base.Contact**.
Have any trick to do that????
4

4 に答える 4

1

Silverlight とは何の関係もありません。

それがキャストの動作です。まだ への参照を返しています。cこれBase.Contact.

呼び出しContactTypeたりPerson、オンにしたりすることはできませんcb(アップキャストしない限り、これはすべきではありません)。

それの何が問題なのですか?

于 2010-04-13T19:19:35.510 に答える
1

キャストによって、クラスをその基本クラスの 1 つに変換することは絶対にできません。使用しているシリアライゼーションのタイプによっては、クラスが基本タイプであると想定するようにシリアライザーに指示できる場合があります。これにより、シリアライゼーションが基本タイプのメンバーに制限されます。

于 2010-04-13T19:43:08.337 に答える
0

私は答えを読みましたが、それでも問題を理解していません!上記のコードの問題は何ですか?


また、コメントから、基本クラスのみをシリアル化する必要があることを理解しています。そもそも問題ないと思います。例を見てください-

class A
{
    public int a = -1;
};

class B : A
{
    public int b = 0;
};

class Program
{
    static void Main(string[] args)
    {
        A aobj = new B();
        aobj.a = 100; // <--- your aobj obviously cannot access B's members.
        Console.In.ReadLine();
    }
}

ここで、シリアル化機能を仮想化する必要がある場合は、はい、問題があります。その後、これは役立つかもしれません-

abstract class Ia
{
    public abstract void Serialize();
}
class A : Ia
{
    public int a = -1;
    sealed public override void Serialize() {
        Console.Out.WriteLine("In A serialize");
    }
};

class B : A
{
    public int b = 0;
    /*
     * Error here -
    public override void Serialize()
    {
        Console.Out.WriteLine("In B serialize");
    }
     */

    //this is ok. This can only be invoked by B's objects.
    public new void Serialize()
    {
        Console.Out.WriteLine("In B serialize");
    }
};

class Program
{
    static void Main(string[] args)
    {
        A aobj = new B();
        aobj.Serialize();
        Console.In.ReadLine();
    }
}

//Output: In A serialize
于 2010-04-13T20:26:06.117 に答える
0

コピーコンストラクターを基本クラス(例)に追加すると、次のpublic Contact(Contact other)ことができます。

Contact c = new Contact();
Base.Contact cb = new Base.Contact(c);
于 2010-04-13T20:18:58.797 に答える