界面问题

时间:2011-01-15 11:54:56

标签: c# interface

这段代码有什么不好?这是一个简单的例子:

class Program
{
    public interface IAccount
    {

    }

    public class Account :IAccount
    {

    }

    public static IAccount LogOn()
    {
        return new Account();
    }

    public class Avatar
    {
        public Account Cred { get; set; }
    }


    static void Main(string[] args)
    {
        var avatar = new Avatar();

        avatar.Cred = LogOn();
    }
}

我收到编译错误:

    Error   5   Cannot implicitly convert type 'console.Program.IAccount' to 'console.Program.Account'. An explicit conversion exists (are you missing a cast?) C:\Users\Jan\Documents\Visual Studio 2010\Projects\BACKUP\Pokec_Messenger\ver.beta
\Pokec__Messenger\console\Program.cs    35  27  console

什么是正确的实施。感谢您的建议

2 个答案:

答案 0 :(得分:3)

您的Avatar.Cred属性类型为Account,而非IAccount ...但LogOn声明只返回IAccount。所以它可以返回一些其他IAccount实现 - 编译器不会让你假设IAccount将是一个没有显式强制转换的帐户。

选项:

  • Cred属性的类型更改为IAccount而不是Account。这可能是最好的,因为它减少了AvatarAccount之间的耦合,因此您可以使用IAccount的其他实现。
  • LogOn的返回类型更改为Account而不是IAccount。这会将LogOn API Account联系起来,而不仅仅是实现
  • 分配属性时进行投射:

    avatar.Cred = (Account) LogOn();
    

答案 1 :(得分:2)

public class Avatar
{
    public IAccount Cred { get; set; }
}