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;
  }
}

错误都在第二类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 返回参数?你确定,你能在两个月内记住这句话的意思吗?

于 2012-08-06T06:19:49.303 回答