C# 注册字段c子类的事件#
让我这样来模拟我的问题 我有一个层次结构,C# 注册字段c子类的事件#,c#,oop,events,C#,Oop,Events,让我这样来模拟我的问题 我有一个层次结构,Dog,Cat,Bird是抽象类Animal的子类Bird有一个新事件BirdEvent,它不在(也不应该在)Animal中 我有一个类MyObject,它有一个类型为Animal(利用多态性)的字段。让我们假设MyObject的一些实例将用Bird填充它们的Animal字段,而另一些实例则用Cat或Dog填充它们的Animal字段。如果Animal字段包含Bird的实例,我想注册它的BirdEvent。但由于字段类型为Animal,因此显然不能有Bir
Dog
,Cat
,Bird
是抽象类Animal
的子类Bird
有一个新事件BirdEvent
,它不在(也不应该在)Animal中
我有一个类MyObject
,它有一个类型为Animal
(利用多态性)的字段。让我们假设MyObject
的一些实例将用Bird
填充它们的Animal
字段,而另一些实例则用Cat
或Dog
填充它们的Animal
字段。如果Animal
字段包含Bird
的实例,我想注册它的BirdEvent
。但由于字段类型为Animal
,因此显然不能有BirdEvent
MyObject myObject= new Myobject();
if (myObject.Animal is Bird)
{
myObject.Animal.BirdEvent += reactToBirdEvent;
}
有没有办法到伯德文特?或者很有可能,我的设计在我没有看到的地方有缺陷吗?你可以将其发送给伯德
:
MyObject myObject= new Myobject();
if (myObject.Animal is Bird)
{
((Bird)myObject.Animal).BirdEvent += reactToBirdEvent;
}
只需使用以下命令将实例强制转换为
Bird
:
你可以把它安全地投给小鸟。好的,这种投法对我来说是新的。谢谢大家!@purrduc注意,这实际上会对对象进行两次强制转换,一次用于
is
,然后再次用于显式强制转换。为了避免这种情况,最好使用as
和null
check.Thx作为您的编辑@TimSchmelter,它更完整now@juharr:,但不是出于性能原因。实际上,如果myObject
是一个值类型,那么as
+null
-检查比is
+显式强制转换更重要。@juharr说,谢谢。只要有任何其他指示表明该对象属于Bird
类型,则可以忽略is
。
Bird myBird = myObject.Animal as Bird;
if (myBird != null)
{
myBird.BirdEvent += reactToBirdEvent;
}