Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 注册字段c子类的事件#_C#_Oop_Events - Fatal编程技术网

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;   
}