2016-05-26 2 views
1

У меня есть следующая проблема в C#.Внедрение общего класса 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(); 
    } 
} 

Но с такой реализацией я получаю ошибки, потому что элементы недоступны. Есть ли способ создать общий класс, используя методы/атрибуты из разных классов, но одинаково определенные?

+4

Почему бы не использовать интерфейс или абстрактный класс ? –

+0

Пожалуйста, взгляните на соглашения об именах, когда у вас есть время http://www.dofactory.com/reference/csharp-coding-standards –

ответ

4

Родовое class вы делаете в настоящее время не имеют ограничений, чтобы знать, с какими class общим типом T должен быть получен из. Таким образом, он принимает object, который не распознает любые настраиваемые поля, свойства и методы, которые вы реализуете.

Если вы хотите родовые 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(); 
    } 
} 

В любом случае для определения полей, свойств и методов требуется общее наследование.

0

Обратите внимание, что в дополнение к Ians ответа при использовании интерфейс, общий не нужно больше вы могли бы просто использовать

class myGeneric { 
    public ImyClass element; 

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

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

Хотя это был не сам вопрос

Смежные вопросы