2012-01-16 39 views
2

如果我非一般的生成器類使用隱式操作每一件事情是確定的:這使用泛型隱式運算符有什麼問題?

public class ReligionBuilder 
{ 
    private Religion _religion; 

    public ReligionBuilder() 
    { 
     _religion = new Religion(){//some codes} 

    } 

    public ReligionBuilder AddToRepository() 
    { 
     Repository<Religion>.Add(_religion); 
     return this; 
    } 
    public Religion Build() 
    { 
     return _religion; 
    } 

    public static implicit operator Religion(ReligionBuilder _builder) 
    { 
     return _builder.Build(); 

    } 
} 

我可以用它:

Religion religion=new ReligionBuilder().AddToRepository(); 

但如果運營商是通用類的東西是錯誤的:

public abstract class DataTestBuilderBase<T> : IDataTestBuilder<T> 
{ 
    protected T TestData { get; set; } 

    public virtual T Build() 
    { 
     return TestData; 
    } 

    public abstract IDataTestBuilder<T> AddToRepository(); 
    public abstract IDataTestBuilder<T> WithDefault(); 

    public static implicit operator T(DataTestBuilderBase<T> builder) 
    { 
     return builder.Build(); 
    } 
} 


public class PersonDataTestBuilder : DataTestBuilderBase<Person> 
{ 
    private Person _person; 

    public PersonDataTestBuilder() 
    { 
     //some codes 
    } 
    public override IDataTestBuilder<Person> AddToRepository() 
    { 
     //some codes 
     return this; 
    } 
} 

用法:

PersonDataTestBuilder _testBuilder = new PersonDataTestBuilder(); 
     Person person = _testBuilder.AddToRepository(); 

錯誤是:無法將IDataTestBuilder轉換爲Person

有什麼問題?

+0

只是一個側面說明,但我們也開始用我們自己的工具建設者,但我們最終使用http://nbuilder.org/它真的很好,並有很多功能。 – 2012-01-16 08:03:45

回答

0

AddToRepository回報只是IDataTestBuilder<Person>(在編譯時返回類型而言) - 而且也沒有隱式轉換從Person。如果將抽象方法的返回類型更改爲DataTestBuilderBase<T>,那麼它應該可行 - 儘管坦率地說我不想使用該隱式轉換。我通常對提供隱式轉換非常謹慎 - 他們通常會讓代碼不太清晰,因爲我相信他們在這裏做。

如果您真的在建造者上提供AddToRepository?這感覺就像一個建設者是不適當的動作 - 我希望:

Person person = new PersonBuilder { /* properties */ } 
        .Build() 
        .AddToRepository(); 

編輯:只是爲了說明我的意思有關更改AddToRepository返回類型,這裏有一個簡短而完整的程序來演示。它工作正常。

using System; 

public abstract class BuilderBase<T> 
{ 
    public abstract T Build(); 
    public abstract BuilderBase<T> AddToRepository(); 

    public static implicit operator T(BuilderBase<T> builder) 
    { 
     return builder.Build(); 
    } 
} 

public class TestBuilder : BuilderBase<string> 
{ 
    public override string Build() 
    { 
     return "Built by Build()"; 
    } 

    public override BuilderBase<string> AddToRepository() 
    { 
     return this; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string x = new TestBuilder().AddToRepository(); 
     Console.WriteLine(x); 
    } 
} 
+0

你是對的,它不應該在建設者,任何方式你的建議沒有工作! – Adrakadabra 2012-01-16 07:52:22

+0

@Adrakadabra:確實如此 - 請參閱我編輯的簡短但完整的示例。沒有更多細節,很難說你做錯了什麼,但是原則應該沒問題。 – 2012-01-16 08:02:22

+0

ü是正確的,它的工作,我的問題是,DataTestBuilderBase 正在實施IDataTestBuilder 和返回類型不正確 – Adrakadabra 2012-01-16 09:04:28