通用参数在继承时是不同的对象

时间:2016-03-11 13:47:37

标签: c# generics inheritance

是否可以在继承时将泛型参数带入任何类型的对象的方法中更改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是一本书。例如。

2 个答案:

答案 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>。这意味着封闭类型可以转换为开放对应类型,但封闭类型不能转换为其他封闭类型,除非适用和协方差的规则适用。