2013-03-22 29 views
6

Nie wiem, jak rozwiązać problem z interfejsem generycznym.Dziedziczenie z interfejsów ogólnych

Generic interfejs reprezentuje fabrykę Dla obiektów:

interface IFactory<T> 
    { 
     // get created object 
     T Get();  
    } 

Interfejs reprezentuje fabrykę komputerów (klasa Computer) specyfing generalny fabryki:

interface IComputerFactory<T> : IFactory<T> 
     where T : Computer 
    { 
     // get created computer 
     new Computer Get(); 
    } 

Generic interfejs reprezentuje specjalny fabryki dla obiektów, które są Cloneable (implementuje interfejs System.ICloneable):

interface ISpecialFactory<T> 
     where T : ICloneable, IFactory<T> 
    { 
     // get created object 
     T Get(); 
    } 

Klasa reprezentuje fabrykę komputerów (klasa Computer) i Cloneable obiektów:

class MyFactory<T> : IComputerFactory<Computer>, ISpecialFactory<T> 
    { 

    } 

otrzymuję komunikaty o błędach kompilator MyFactory Klasa:

The type 'T' cannot be used as type parameter 'T' in the generic type or method 'exer.ISpecialFactory<T>'. There is no boxing conversion or type parameter conversion from 'T' to 'exer.IFactory<T>'. 

The type 'T' cannot be used as type parameter 'T' in the generic type or method 'exer.ISpecialFactory<T>'. There is no boxing conversion or type parameter conversion from 'T' to 'System.ICloneable'. 

Odpowiedz

8

Nie jestem pewien, czy jest to literówka, ale powinno to:

interface ISpecialFactory<T> 
     where T : ICloneable, IFactory<T> 

zostały rzeczywiście

interface ISpecialFactory<T> : IFactory<T> 
     where T : ICloneable 

Naprawdę, myślę, że jest to prawdopodobnie co próbujesz zrobić:

public class Computer : ICloneable 
{ 
    public object Clone(){ return new Computer(); } 
} 

public interface IFactory<T> 
{ 
    T Get();  
} 

public interface IComputerFactory : IFactory<Computer> 
{ 
    Computer Get(); 
} 

public interface ISpecialFactory<T>: IFactory<T> 
    where T : ICloneable 
{ 
    T Get(); 
} 

public class MyFactory : IComputerFactory, ISpecialFactory<Computer> 
{ 
    public Computer Get() 
    { 
     return new Computer(); 
    } 
} 

żywo przykład: http://rextester.com/ENLPO67010

+0

Dziękuję za odpowiedź, ale nie jest to dokładnie to, co chcę osiągnąć. Czy mógłbyś to zmienić w taki sposób, że MyFactory produkuje wszystkie obiekty klonowane, nie tylko "komputerowe"? – Matt

+0

@Matt - Przepraszam, że to nie ma większego sensu. Jeśli fabryka nie zostanie zabetonowana, skąd wie, * jak * zbudować coś? Nawet w twoim oryginalnym wpisie 'MyFactory' zaimplementował' IComputerFactory'. Powinieneś zaktualizować swoje pytanie z nieco większym kontekstem * tego, co próbujesz osiągnąć * – Jamiec

+0

Jeśli fabryka nie zostanie zabetonowana, w jaki sposób wie, jak coś zbudować? Myślałem, że używam generycznych. Im moje oryginalne posty MyFactory implementuje interfejs IComputerFactory i interfejs ISpecialFactory. Oznacza to, że MyFactory może produkować nie tylko instancje klasy Computer, ale także instancje wszystkich klas, które są klonowalne. Myślałem, że jest to możliwe dzięki nowej metodzie w klasie myFactory, coś w rodzaju publicznego T Uzyskaj {return new T()}. Nie wiem, czy to możliwe ... – Matt

2

Spróbuj blok ten kod:

class MyFactory<T> : IComputerFactory<Computer>, ISpecialFactory<T> 
    where T: ICloneable, IFactory<T> 
    { 

    } 
3

Chyba swoją definicję z ISpecialFactory<T> jest niepoprawna. Zmień go na adres:

interface ISpecialFactory<T> : IFactory<T> 
    where T : ICloneable 
{ 
    // get created object 
    T Get(); 
} 

Ewentualnie nie chcą typ T wdrożyć IFactory<T>!

Powiązane problemy