是否可以在继承时将泛型参数带入任何类型的对象的方法中更改T的类型。例如,我有这个界面:
public interface IMethod
{
void Add<T>(T obj);
List<T> Get<T>();
void Update<T>(T obj);
void Delete<T>(T obj);
}
我有4个班,书,书柜,书架。对于它们中的每一个,我都有另一个实现方法的类,所以我在那里有功能。这是Bookcasecatalog的分类。
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是一本书。例如。
答案 0 :(得分:2)
正如你现在所做的那样,用户可以在调用方法state = std::find(windowPtr->begin(), windowPtr->end(), [=] (Window* w) {return w->handle == hwnd;}) != windowPtr->end();
时决定他使用哪种T(你的约束限制了这一点,但这不是如何使用它们的想法,他们不应该&#39} ; t用于实施。)。
如果可以,请使您的界面通用。这将允许您在实现类时决定T是什么。例如:
Add
这会使您的所有 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
答案 1 :(得分:0)
我认为你需要的是通用界面!
您应该将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>
。这意味着封闭类型可以转换为开放对应类型,但封闭类型不能转换为其他封闭类型,除非适用和协方差的规则适用。