向下转换到接口会导致丢失派生的功能吗?

时间:2015-08-31 23:06:41

标签: c# inheritance interface polymorphism

我试图抛弃一个变量。基本上我将派生类存储在接口变量中。

这导致编译时错误:

  

错误1无法隐式转换类型' Xamarin.Auth.Account'到了#cc; IAccount'。存在显式转换(您是否错过了演员?)

所以我将变量转换为接口。如果我将其转换为接口,我将丢失任何派生类的功能吗?

public interface IAccount
{

}

public class Account :  Xamarin.Auth.Account, IAccount
{

}

...Inside view model
private IAccount _account;
_account = eventArgs.Account; // causes compiler error

_account = (IAccount)eventArgs.Account; // solution but will I loose functionality?

// eventArgs.Account = Xamarin.Auth.Account data type

2 个答案:

答案 0 :(得分:3)

演员阵容不能“失去功能”;没有办法改变对象是哪个类。它可能会失败,但它不会改变任何东西。

但是,出于这个原因,允许隐含地向下转换;你实际上不会得到那个错误。

听起来eventArgs.Account实际上是Xamarin.Auth.Account,它没有实现你的界面;因此,您的转换将失败(除非您碰巧知道它在运行时确实是您的Account类的实例)。

答案 1 :(得分:1)

检查eventArgs中对象的类型是YourNamespace.Account还是Xamarin.Auth.Account?

我认为它是Xamarin.Auth.Account,它不会继承IAccount,因此无法转换为它。我建议将您的Account类转换为代理(包装器)类,该类在其构造函数中使用Xamarin.Auth.Account类。

public interface IAccount
{

}

public class Account :  Xamarin.Auth.Account, IAccount
{
    public Account(Xamarin.Auth.Account account) :
        base(account.Username, account.Properties, account.Cookies)
    {
    }
}

_account = new YourNamespace.Account(eventArgs.Account);

另一种选择,也许不是继承Xamarin.Auth.Account,您可以在Xamarin.Auth.Account类中将您的Account类中的方法实现为extension methods