2010-05-26 90 views
0

嗨,我不能与此代码管理。这个想法是在错误的创建方法执行的情况下返回默认的英文字母。谢谢。问题与铸造X <char>为x <t>

一个想法覆盖明确运营商是很好的,但我不能想象铸造的实现。

namespace trie 
    { 
     class AlphabetFactory<T> where T: IConvertible 
     { 
      public Alphabet<char> SetDefaultAlphabet() 
      { 
       var list = new char[26]; 
       for (var i = Convert.ToInt32('a'); i <= Convert.ToInt32('z'); i++) 
        list[i] = Convert.ToChar(i); 
       return new Alphabet<char>(list); 
      } 

      public Alphabet<T> Create(params T[] list) 
      { 
       if (list != null) 
        return new Alphabet<T>(list); 
       else 
        return SetDefaultAlphabet(); // <- This is not correct 
      } 
     } 
    } 
+0

如果你把它叫做'新AlphabetFactory () .Create(空)'?我认为你在这里绊倒了你的设计。 – 2010-05-26 20:06:38

+1

我不明白你要完成的任务。看起来你没有仔细考虑过你的问题。例如:如果你的'Create'方法被调用'T == int'和'名单== null',那么你想要什么回来?你不能在这种情况下返回字母,因为'T == int',你能吗?那又怎么样? – 2010-05-26 20:08:39

+0

@Lasse:有趣的是,有人投了我的问题,虽然你被要求早两分钟,而且基本上是相同的。 :-) – 2010-05-26 20:37:51

回答

0

我能想到的来完成你想要的东西,唯一的办法就是让Alphabet<T>继承非通用抽象的基础上,否则执行非通用接口。然后,你的代码可能是这个样子:

interface IAlphabet { 
    // ? 
} 

class Alphabet<T> : IAlphabet { 
    // stuff 
} 

class AlphabetFactory { 
    // ... 

    IAlphabet Create<T>(params T[] list) where T : IConvertible { 
     if (list != null) 
      return new Alphabet<T>(list); 
     else 
      return SetDefaultAlphabet(); 
    } 

    // ... 
} 

这将使用AlphabetFactory更为麻烦使用使客户端代码,虽然:

int[] integers = GetIntegers(); // let's say this might be null 

var alphabet = myAlphabetFactory.Create(integers); 

var integerAlphabet = alphabet as Alphabet<int>; 
if (integerAlphabet != null) { 
    // do stuff with integerAlphabet 
} else { 
    // alphabet is an IAlphabet, but not an Alphabet<int> 
}