1

既存の構造に新しいクラスを追加する際に問題が発生しました。私の問題をできるだけ明確に説明します

public interface Imust
{
    string Name { get; set; }
    string File { get; set; }
    string RowKey { get; set; }
    string Time { get; set; }
    string PartitionKey { get; set; }
}

public class TA : TableServiceEntity, Imust
{
    public string Time { get; set; }
    public string Name { get; set; }
    public string File { get; set; }
}

public class TB : TableServiceEntity, Imust
{
    public string Time { get; set; }
    public string Name { get; set; }
    public string File { get; set; }
}

public class TC : TableServiceEntity, Imust
{
    public string Time { get; set; }
    public string Name { get; set; }
    public string File { get; set; }
}    

public class _Table <T> : _Account where T : Imust 
{
}

ここで、上記の 3 つのクラスはテーブルとして実装され、そのプロパティはプロジェクトの列として実装されます。ジェネリック クラスではインターフェイス制約を設定するため、Imust インターフェイスは各クラスに実装されます。TableServiceEntity クラスには、RowKey と PartitionKey の実装が含まれています。また、このクラスは 3 つのエンティティすべてで継承されます。

問題: アプリケーションに新しいテーブルを追加する必要があります。そのため、ここに新しいクラスを追加する必要があります。

public class TD : TableServiceEntity
{

}    

このクラスにはこれらの列が含まれていないため、Imust インターフェースを実装したくありません。しかし、ジェネリッククラスのパラメーターとして渡す必要があります_Table。この新しいクラスには異なる列がありますが、他の3つのエンティティと同じ機能を実行するためです。既存の構造体を維持しながら、この新しいクラスを追加するにはどうすればよいですか?

この問題のより良い解決策を教えてください。

編集

はい、制約 TableServiceEntity を基本クラスとして配置できます。しかし、ジェネリッククラスでは、プロパティ_Tableを操作する関数はほとんどありませんFile

    public T AccessEntity(string Id = "0", string File = "0")
    {
        return (from e in ServiceContext.CreateQuery<T>(TableName)
                where e.RowKey == Id || e.File == File
                select e).FirstOrDefault();
    }

このインターフェイスの制約を削除すると、エラーが表示されT does not have a defination for Fileます。

4

5 に答える 5

1

私はこれを行います...テーブルのより一般的なタイプはTableServiceEntityであるため、インターフェイスは宣言に意味がありません

public class _Table <T> : _Account where T : TableServiceEntity
{
}
于 2012-07-24T13:26:04.510 に答える
1

インターフェイスを 2 つに分割します。

public interface Ibase

    string RowKey { get; set; }
    string PartitionKey { get; set; }
}

public interface Imust : Ibase
{
    string Name { get; set; }
    string File { get; set; }
    string Time { get; set; }
}

public class TA : TableServiceEntity, Imust
{
    public string Time { get; set; }
    public string Name { get; set; }
    public string File { get; set; }
}

public class TB : TableServiceEntity, Imust
{
    public string Time { get; set; }
    public string Name { get; set; }
    public string File { get; set; }
}

public class TC : TableServiceEntity, Imust
{
    public string Time { get; set; }
    public string Name { get; set; }
    public string File { get; set; }
}    


public class _BaseTable <T> : _Account where T : Ibase 
{
}

public class _Table <T> : _BaseTable<T> where T : Imust 
{
}

_BaseTableまた、 および に固有の共通機能を 、TimeおよびNameに実装File_Tableます。

質問に対して行った編集後は、さらに直感的になります。のこれらのメソッドは_BaseTable、 に依存するかFile、 で抽象化してオーバーライドすることができます。NameTime_Table

于 2012-07-24T13:29:37.107 に答える
0
  1. まったく同じ 3 つのクラス (TA、TB、および TC) があります。でも、なぜあなたは単一のクラスを持たないのですか?
  2. 動作(つまり、メソッド) には、インターフェイスを使用します。構造(つまり、プロパティ) には、継承( at などTableServiceEntity) を使用します。
  3. TD が基本クラスから継承されるようにしますが、インターフェイスは実装しません。
  4. での制限を次のように変更_Tableしますwhere T : TableServiceEntity

よろしく

于 2012-07-24T13:25:45.050 に答える
0

ポスターの追加情報を反映するように更新:

新しいインターフェースを指定する必要があります:

public interface IMust2 {
    public string File {get;set;}
    public string Rowkey {get;set;

}

IMust2 から継承するように IMust を変更する

public interface IMust : IMust2 
{
   public string Name {get;set;}
   public string Time {get;set;}
   public string PartitoinKey {get;set;}
}
于 2012-07-24T13:28:09.690 に答える
0

_Table を<TableServiceEntity>タイプにするだけではどうですか? 明らかに、あなたはあなたのインターフェースを壊しているので、すべてのクラスがそのインターフェースになるわけではないので、それをジェネリックとして使い続けることはできませんか?

于 2012-07-24T13:25:08.820 に答える