0

私はいくつかのクラスのデータ層を設計しています。これらのクラスのそれぞれが、私が設定した契約に従うことを望んでいますIMyDataItem:

public delegate void ItemChangedHandler(object sender, EventArgs e);

public interface IMyDataItem<T> {
  string Insert { get; }
  int Save();
  string Select { get; }
  string Update { get; }
}

それが完了したら、他のすべてのクラスが継承する基本クラスを含めたいと思います。

この基本クラスを修正するにはどうすればよいですか?

public class MyDataItem : IMyDataItem<T> {

  private const string TODO = "TODO: This has not been done.";
  public const int NOT_SET = -1;

  private bool changed;
  internal int rowId;

  public MyDataItem() {
    changed = false;
    rowId = NOT_SET;
  }

  public ItemChangedHandler OnChange;

  internal void notify() {
    changed = true;
    if (OnChange != null) {
      OnChange(this, new EventArgs());
    }
  }

  public int RowID {
    get { return rowId; }
    set {
      if (rowId != value) {
        rowId = value;
        notify();
      }
    }
  }

  public bool SaveNeeded { get { return changed; } }

  public static virtual T Load() {
    return default(T);
  }

  public virtual string Insert { get { return TODO; } }

  public virtual string Select { get { return TODO; } }

  public virtual string Update { get { return TODO; } }

  public virtual int Save() {
    changed = false;
    return NOT_SET;
  }
}

エラーはすべて 2 番目のクラスMyDataItem(私の基本クラス) にあります。

  • タイプまたはネームスペース名 'T' が見つかりませんでした - クラスを宣言する最初の行にあります。

where署名に句を追加して、エラーを削除しようとしました。

public class MyDataItem : IMyDataItem<T> where T : MyDataItem {

ただし、これにより次のエラーが表示されました。

  • 非ジェネリック宣言では制約を使用できません

私が求めていることを行う方法はありますか、またはより単純なクラス設計に固執する必要がありますか?

基本クラスが完成すると、LocationEmployeeRecordなどの他のクラスがそれを継承します。

4

4 に答える 4

4

特にコンパイル時のエラーを修正するには、次のものが必要です。

public class MyDataItem<T> : IMyDataItem<T>

ただし、何を達成しようとしているのかを詳しく知らなければ、別のアプローチを推奨することは困難です。

于 2012-08-05T20:05:54.207 に答える
2

インターフェイスからを削除して<T>、非ジェネリックにしないのはなぜですか? はTインターフェイスでは使用されません。

それ以外の場合、クラスをジェネリックにしたい場合は、次のように言います

public class MyDataItem<T> : IMyDataItem<T>

しかし、繰り返しになりTますが、使用されていない場合、それを宣言する理由は何ですか?

于 2012-08-05T20:09:58.293 に答える
1

あなたがやろうとしていることは、私がやったことにいくらか似ています。すべての「データ マネージャー」インスタンスに適用可能な一般的なコードが必要でしたが、それらに強力な型付けを適用したいとも考えていました...同様の方法で...

public interface iMyDataManager
{  
   stuff ... 
}

public class MyDataManager<T> : iMyDataManager
{  
   implementation ... that I want common to all derived specific instances 
}


public class MySpecificDataInstance : MyDataManager<MySpecificDataInstance>
{
   continue with rest of actual implementations specific to this class.
}
于 2012-08-05T20:46:38.993 に答える
0

実装でジェネリックを使用する理由は見当たりませんでした。二次的に、これらの関数のパラメータについて確信がありますか:

  string Insert { get; }
  int Save();
  string Select { get; }
  string Update { get; }

Update と Insert がパラメータを返す理由 2ヶ月以内にこれの意味を思い出せると思いますか?

于 2012-08-06T06:19:49.303 に答える