[英]Downcasting C# .NET
这是我的示例:
public class Person
{
public string Name { get; set; }
}
public class Client : Person
{
public string LastName { get; set; }
}
public class Test
{
Person p = new Person();
Client c = (Client)p; //throws exception
}
由于客户是从Person继承的,为什么我不能这样做? 如果我可以并且这是错误的方式,我该怎么办?
OBS:我知道上面的示例可以做到:
Person p = new Client();
Client c = (Client)p;
实际上,绕了一点弯路,您就可以进行这种转换,但是,对于其他两个类,它都需要一个额外的父类,并且需要一个隐式运算符才能将Client转换为Person(尽管这可能不是您最初想要的)
class Program
{
public abstract class BasePerson
{
public string FirstName { get; set; }
}
public class Person : BasePerson
{
}
public class Client : BasePerson
{
public string LastName { get; set; }
public static implicit operator Client(Person p)
{
if (p == null)
{
return null;
}
return new Client { FirstName = p.FirstName };
}
}
static void Main(string[] args)
{
Person p = new Person { FirstName = "Test" };
Client c = (Client)p;
Console.WriteLine(c.FirstName);
Console.ReadLine();
}
}
它将编译并将FirstName提供给客户端,并具有姓氏的可能性,但是,正如我所说,这可能不是您所追求的,只是使您的代码可以编译并以最小的更改运行的可能性...
更新
如评论中所讨论的,如果我需要实现这种转换,则我更愿意选择
创建一个辅助方法
public class Client : Person { public static Client GetClientFromPerson(Person p) { if (p == null) { return null; } return new Client { FirstName = p.FirstName }; } }
这将导致:
Client c = Client.GetClientFromPerson(p);
添加第二个构造函数
public class Client : Person { public string LastName { get; set; } public Client() { } public Client(Person p) : this() { FirstName = p.FirstName; } }
这将导致:
Client c = new Client(p);
这将使其他人查看代码变得容易得多,将来也可能进行维护,并且不需要您更改现在拥有的继承关系。
Person
不是Client
因此您希望编译器如何转换它? 试试这个,你会得到一个null
:
Client c = p as Client;
换句话说:编译器错误消失了,但是c始终为null
。
这会引发异常,因为p
不是客户端。 p
已创建为person
。 您可以创建一个client
object并将其强制转换为它的基类person
,但是这种方式并非如此。
子级可以继承其父类的所有属性,但是父级只能继承公共属性。 这并不意味着您可以直接将父对象分配给它的子对象。
您可以使用as和is歌剧来做到这一点 。
通过使用as运算符,如果变量不为null,则该类可转换为其他类
Person p = new Person();
var conversionResultFromPersonToClient = p as Client;
if(conversionResultFromPersonToClient != null)
//it means you can cast from person to client
第二个方法是用的就是运营商
Person p = new Person();
Client c = new Client();
if(p is Client)
//Then you can cast person to client
c = (Client)p;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.