繁体   English   中英

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

[英]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.

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