2013-03-22 3 views
6

Я не знаю, как решить проблему с помощью общих интерфейсов.Наследование от общих интерфейсов

Общий интерфейс представляет собой фабрику для объектов:

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

Интерфейс представляет завод для компьютеров (компьютерный класс) specyfing общая заводскую:

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

Общий интерфейс представляет собой специальный завод для объектов, которые клонируемыми (реализует интерфейс System.ICloneable):

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

класса представляет фабрику для компьютеров (компьютерный класс) и Cloneable объектов:

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

    } 

Я получаю компилятор сообщений об ошибках В MyFactory класса:

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'. 

ответ

8

Не уверены, что это опечатка, но должны это:

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

действительно были

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

Действительно, я думаю, что это, вероятно, что вы пытаетесь сделать:

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(); 
    } 
} 

Живой пример: http://rextester.com/ENLPO67010

+0

Благодарим вас за ответ, но это не совсем то, чего я хочу достичь. Не могли бы вы изменить его таким образом, чтобы MyFactory создавал все клонируемые объекты, а не только объекты «Компьютер»? – Matt

+0

@Matt - Извините, что это не имеет большого смысла. Если завод не зацикливается, как он знает, как * что-то конструировать? Даже в вашем исходном сообщении 'MyFactory' реализован' IComputerFactory'. Вы должны обновить свой вопрос с помощью немного большего контекста на *, чего вы пытаетесь достичь * – Jamiec

+0

Если фабрика не зацикливается, как она знает, как ее построить? Я думал использовать дженерики. Im мои исходные сообщения MyFactory реализует интерфейс IComputerFactory и интерфейс ISpecialFactory. Это означает, что MyFactory может создавать не только экземпляры класса Computer, но и экземпляры всех классов, которые являются клонируемыми. Я думал, что это возможно с новым методом в классе myFactory, что-то вроде public T Get {return new T()}. Я не знаю, возможно ли это ... – Matt

2

Попробуйте этот блок кода:

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

    } 
3

Я предполагаю ваше определение от ISpecialFactory<T>. Измените его на:

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

Вы, возможно, не хотите T типа для реализации IFactory<T>!