1

Aとの間で自分自身をシリアル化できる抽象クラスがありますbyte[]

別のクラスは、パラメーターなしのコンストラクターであるか、継承する必要があるC型でパラメーター化されています。と の間で双方向に変換する必要があります。TACTbyte[]

Class C <T> where T : A, new() { ... }

問題は次のとおりTですbyte[]

Aオーバーライドできないため、の静的メソッドを使用できません。T(byte[])C# で許可されていないため、を呼び出すことができません。

私が見つけた唯一の方法は、のインスタンスを作成し、Tからオーバーライドされたメソッドを呼び出すことAです。

byte[] bytes; // some byte table
T someT = new T();
T.LoadFromBytes(bytes);

私はうまくいきますが、多くの場合、バイトからの新しいオブジェクトにしか変換できませんT。より良い解決策や次のような方法はありますか:

public class SomeTClass : A
{
    public SomeTClass(){...}
    public void LoadFromBytes(byte[] bytes)
    {
        SomeTClass newT = Sth(bytes); /* new instance of SomeTClass
                                         is created from bytes */
        this = newT; /* can't do this, but I need to replace
                        current instance with the new one */
    }
}
4

2 に答える 2

1

この問題は解決できましたが、作成したコードが気に入りません。

アイデアは、クラス A を T でパラメーター化し、抽象メソッドを作成することです。これは、テンプレート型から使用されていない場合は静的になります。

public abstract class A <T>
{
    public abstract byte[] Serialize();
    public abstract T Deserialize(byte[]); //should be static
}

クラスCに新しい要件があります:

public class C <T> where T : A <T>
{
    someMethod(...)
    {
        ...
        byte[] bytes; // some bytes
        T = new T().Deserialize(bytes); // should be T.Deserialize(bytes)
        ...
    }
}

そしていくつかのT実装:

public class SomeTClass : A<SomeTClass>
{
    public SomeTClass Deserialize(byte[])
    {
        //deserialization code
    }
}
于 2013-02-11T15:42:24.293 に答える
0

UpdateReferenceメソッドと逆シリアル化の実装を見てください。逆シリアル化メソッドをfarbic method. 入力パラメーターとして受け取りbyte[]、必要な型の新しいインスタンスを返す必要があります。それはあなたが望むものですか?

class C <T> where T : IA, new()
{
  public T Data { get; set; }
  .....

  public UpdateReference()
  {
    byte[] data = GetBytesFromSomewhere();
    Data = AImpl.Deserialize(data);

    Data.UserfulMethod();
    Data.AnotherUserfulMethod();

    data = GetBytesFromSomewhere();
    Data = AImpl.Deserialize(data)

    Data.UserfulMethod();
    Data.AnotherUserfulMethod();
  }
}

public interface IA
{
  public byte[] Serialize();
  public A Deserialize(byte[] data);

  public string UsefuleMethod1();
  public int AnotherUsefulMethod();
}

public class AImpl : IA
{
  public byte[] Serialize()
  {
    //Concrete implementation serialization
  }

  public static IA Deserialize(byte[] data)
  {
    //Concrete implementation deserialization
  }
}
于 2013-02-11T15:20:22.660 に答える