使用与其他人共同的方法实现Generic C#类

时间:2016-05-26 08:36:41

标签: c# class generics

我在C#中遇到以下问题。

我有两个类暴露了一些常见的成员和方法,例如:

Class myClass01{
   public int a;
   public int b;
   public void method_01(){...}
   public void method_A(){...}
}

Class myClass02{
   public int a;
   public int b;
   public void method_01(){...}
   public void method_B(){...}
}

我想创建一个新的通用class,它可以使用它们的公共属性/方法。例如:

Class myGeneric<T>{
   public T element;

   public int sum(){
       return element.a + element.b;
   }

   public void methodGeneric(){
       element.method_01();
    }
}

但是由于这种实现,我收到错误,因为元素不可访问。有没有办法使用来自不同类但同样定义的方法/属性来创建泛型类?

3 个答案:

答案 0 :(得分:4)

您目前正在制作的通用class没有约束条件来了解必须从class派生通用类型T。因此,它假设object无法识别您实现的任何自定义public/protected字段,属性和方法。

如果您希望通用T识别两个类之间共有的public/protected字段,属性和方法,则应创建一个interface,它由两个类实现并且您具有从该特定T派生的泛型类型interface

例如:

public interface ImyClass { //this is the common interface
    int a { get; set; }
    int b { get; set; }
    void method_01();
}

class myClass01 : ImyClass { //your special interface implementation for myClass01
    public int a { get; set; }
    public int b { get; set; }
    public void method_01() { }
    public void method_A() { }
}

class myClass02 : ImyClass {  //your special interface implementation for myClass02
    public int a { get; set; }
    public int b { get; set; }
    public void method_01() { }
    public void method_B() { }
}

然后在您的通用中,使用interface

约束泛型类型
class myGeneric<T> where T : ImyClass {
    public T element;

    public int sum() {              
        return element.a + element.b;
    }

    public void methodGeneric() {
        element.method_01();
    }
}

如果两种方法(两种abstract)的实现完全相同,您也可以使用class或简单基数method_01,例如:

public abstract class myAbstractClass { //this is the common abstract class or base class
    public int a;
    public int b;
    public void method_01(){ } // all your common implementations
}

public class myClass01 : myAbstractClass {
    public void method_A() { } //your special implementation for myClass01
}

public class myClass02 : myAbstractClass {
    public void method_B() { } //your special implementation for myClass02
}

class myGeneric<T> where T : myAbstractClass { //generic specifically from myAbstractClass 
    public T element;

    public int sum() {              
        return element.a + element.b;
    }

    public void methodGeneric() {
        element.method_01();
    }
}

在任何情况下,都需要公共继承来识别public/protected字段,属性和方法。

答案 1 :(得分:0)

使用Interfaces和“where”可以访问成员。 E.g:

public class SortedList<T> : GenericList<T> where T : System.IComparable<T>

https://msdn.microsoft.com/en-us/library/kwtft8ak.aspx

答案 2 :(得分:0)

请注意,除了Ians在使用界面时回答,不再需要通用,你可以简单地使用

class myGeneric {
    public ImyClass element;

    public int sum() {              
        return element.a + element.b;
    }

    public void methodGeneric() {
        element.method_01();
    }
}

虽然这不是实际问题