繁体   English   中英

接口,继承和C#

[英]Interface, Inheritance, and C#

我正在为几个类设计一个数据层,并且我希望这些类都遵循我与IMyDataItem建立的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)将继承该基类。

要解决该特别是编译时错误,您需要:

public class MyDataItem<T> : IMyDataItem<T>

但是,在不了解您要实现的目标的情况下,很难推荐一种替代方法。

为什么不从界面中删除<T>并将其设为非通用? 接口中未使用T

否则,如果您希望该类是通用类,请说

public class MyDataItem<T> : IMyDataItem<T>

但是同样,如果不使用T ,则声明它的理由是什么?

您正在尝试执行的操作与我也已执行的操作有些相似。 我想要一些适用于我所有“数据管理器”实例的通用代码,但也想对它们应用更强的输入方式……以类似的方式……

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

我没有发现在您的实现中使用泛型的任何原因。 其次,您确定这些功能的参数吗:

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

为什么更新和插入返回参数? 您确定,您将在2个月内记住此意思吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM