我在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();
}
}
但是由于这种实现,我收到错误,因为元素不可访问。有没有办法使用来自不同类但同样定义的方法/属性来创建泛型类?
答案 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>
答案 2 :(得分:0)
请注意,除了Ians在使用界面时回答,不再需要通用,你可以简单地使用
class myGeneric {
public ImyClass element;
public int sum() {
return element.a + element.b;
}
public void methodGeneric() {
element.method_01();
}
}
虽然这不是实际问题