[英]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
(我的基类)中:
我尝试通过在签名中添加where
子句来消除错误:
public class MyDataItem : IMyDataItem<T> where T : MyDataItem {
但是,这给我带来了错误:
有什么方法可以做我想要做的事情,还是需要坚持简单的课堂设计?
基类完成后,其他类(例如Location , Employee和Record)将继承该基类。
要解决该特别是编译时错误,您需要:
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.