Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 泛型参数在继承时是不同的对象_C#_Generics_Inheritance - Fatal编程技术网

C# 泛型参数在继承时是不同的对象

C# 泛型参数在继承时是不同的对象,c#,generics,inheritance,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); } 公共接口方法 { 无效添加(T obj); List Get(); 无效更新(

在继承时将泛型参数带入任何类型对象的方法中,是否可以更改T的类型。例如,我有这个界面:

public interface IMethod 
{


     void Add<T>(T obj);
     List<T> Get<T>();
     void Update<T>(T obj);
     void Delete<T>(T obj);
}

公共接口方法
{
无效添加(T obj);
List Get();
无效更新(T obj);
无效删除(T obj);
}
我有四门课,分别是书、书架、书架。对于它们中的每一个,我都有另一个类,在那里我实现了这些方法,因此我有了其中的功能。这是书架目录

 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
    }
公共类书架目录:i方法
{
私人可观察收集案件;
公共字符串连接字符串{get;set;}
公共空白添加(书架obj)
{
}
公共作废添加(T obj),其中T:书架
{
//做smth
}
}


当我在这里完成时,将它继承到另一个类中的接口,例如,T是一本书。

现在,用户可以决定在调用方法时使用什么类型的T
Add
(您的约束限制了这一点,但这不是如何使用它们的想法,它们不应该在实现时使用)

如果可以,请将界面设置为通用。这将允许您在实现类时决定T是什么。例如:

    public interface IMethod<T>
    {
         void Add<T>(T obj);
         List<T> Get<T>();
         void Update<T>(T obj);
         void Delete<T>(T obj);
    }

我想你需要的是一个通用的界面

您应该将
i方法更改为:

public interface IMethod<T> {
    void Add(T obj);
    List<T> Get();
    void Update(T obj);
    void Delete(T obj);
}
就这样

我认为最好在这里学习一些术语
IMethod
称为封闭类型,
IMethod
称为开放类型


请注意,如果一个方法需要一个
IMethod
的参数,您可以向它传递一个
IMethod
。但如果它需要
IMethod
,则不能给它
IMethod
。这意味着关闭类型可以转换为其打开的对应类型,但关闭类型不能转换为其他关闭类型,除非应用反向和协变规则。

公共接口I方法
?此外,在谈到接口时,当我说“继承”时,我得到了一个对话,所以我要把它传下去:正确的单词是Implements。作为记录,一个类不是从接口继承的,这个类实现了ithey andas,介意接受一个答案还是告诉我们你还错过了什么才能被接受吗?
Add
的实现将读作
public void Add(Bookcase Bookcase){}
public interface IMethod<T> {
    void Add(T obj);
    List<T> Get();
    void Update(T obj);
    void Delete(T obj);
}
public class BookcaseCatalog : IMethod<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*/}
}