2013-03-22 131 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(); 
    } 

類代表工廠計算機(計算機類)和可複製的對象:

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 2013-03-22 14:58:58

+0

@Matt - 對不起,沒有多大意義。如果工廠沒有變得具體化,它是如何知道如何構建某種東西的?即使在您的原始文章'MyFactory'中實現了'IComputerFactory'。你應該更新你的問題,更多的上下文*你想要達到什麼* – Jamiec 2013-03-22 15:24:52

+0

如果工廠沒有變得具體化,它怎麼知道如何構建一些東西?我認爲使用泛型。我的原始帖子MyFactory實現IComputerFactory接口和ISpecialFactory接口。這意味着MyFactory不僅能夠產生Computer類的實例,還能產生所有可克隆類的實例。我認爲可能在myFactory類中使用新方法,例如public T Get {return new T()}。我不知道是否有可能...... – Matt 2013-03-22 15:51:10

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>