[英]Generic parameter being different object when inherited
是否可以在继承时将通用参数带入任何对象的方法中更改T的类型。 例如,我有以下界面:
public interface IMethod
{
void Add<T>(T obj);
List<T> Get<T>();
void Update<T>(T obj);
void Delete<T>(T obj);
}
我有四个班级,分别是书本,书柜和书架。 对于它们中的每一个,我都有另一个实现方法的类,因此我在其中具有功能。 这是Bookcase目录分类。
public class BookcaseCatalog: IMethod
{
private ObservableCollection<Bookcase> obsCase;
public string ConnectionString { get; set; }
public void Add(Bookcase obj)
{
}
public void Add<T>(T obj) where T : Bookcase
{
//Do smth
}
}
在这里完成操作后,可以在另一个类中继承该接口,例如T是一本书。
就像您现在所拥有的那样,用户可以在调用方法Add
时决定使用哪种T(您的约束限制了这一点,但是那不是如何使用它们的想法,不应在实现时使用它们。)。
如果可以,请使您的界面通用。 这将允许您在实现类时决定T是什么。 例:
public interface IMethod<T>
{
void Add<T>(T obj);
List<T> Get<T>();
void Update<T>(T obj);
void Delete<T>(T obj);
}
这将使您所有的T
与函数中的T
具有相同的类型
您可以像这样使用它:
public class BookcaseCatalog: IMethod<Bookcase>
{
private ObservableCollection<Bookcase> obsCase;
public string ConnectionString { get; set; }
public void Add(Bookcase obj)
{
//Do smth
}
}
我认为您需要的是通用接口!
您应该将IMethod
更改为此:
public interface IMethod<T> {
void Add(T obj);
List<T> Get();
void Update(T obj);
void Delete(T obj);
}
现在知道了吗? 实现接口时,将指定一种类型:
public class BookcaseCatalog : IMethod<Bookcase> {
//...
}
然后,接口中的所有T将被Bookcase
替换:
public class Bookcase : IMethod<Bookcase> {
public void Add(Bookcase obj) {/*Do something*/}
public List<Bookcase> Get() {return something}
public void Update(Bookcase obj) {/*Do something*/}
public void Delete(Bookcase obj) {/*Do something*/}
}
而已!
我认为最好在这里学习一些术语。 IMethod<Bookcase>
被称为封闭类型 ,而IMethod<T>
被称为开放类型 。
请注意,如果一个方法需要一个的参数IMethod<T>
你可以通过它的IMethod<Bookcase>
。 但是,如果它想要一个IMethod<Bookcase>
, 则不能给它一个IMethod<SomethingElse>
。 这意味着可以将封闭类型转换为其开放的对应类型,但是除非适用相反和协方差的规则,否则封闭类型不能转换为其他封闭类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.