2010-04-01 68 views
4

实现其定义一个基类财产为什么不能在类实现接口返回一个派生类对象类型的接口时,让我们创建一些接口在实现定义基类属性的接口时,为什么类实现接口不能返回派生类类型对象?

public interface ITimeEventHandler 
    { 
     string Open(); 
    } 

    public interface IJobTimeEventHandler : ITimeEventHandler 
    { 
     string DeleteJob(); 
    } 

    public interface IActivityTimeEventHandler : ITimeEventHandler 
    { 
     string DeleteActivity(); 
    } 



    public interface ITimeEvent 
    { 
     ITimeEventHandler Handler { get; } 
    } 

    public interface IJobTimeEvent : ITimeEvent 
    { 
     int JobID { get; } 
    } 

创建一个类

public class JobTimeEvent : IJobTimeEvent 
    { 
     public int JobID 
     { 
      get; internal set; 

     } 

     public IJobTimeEventHandler Handler 
     { 
      get; internal set; 
     } 

    } 

我的问题是.. ??

在课堂JobTimeEvent前,IJobtimeEvent需要类型ITimeEventHandler的属性,但为什么IJobTimeEventHandler类型是不允许从ITimeEventHandler

衍生
+0

你的问题很难理解。你可以尝试改写它吗? – 2010-04-01 17:38:31

+0

您的代码无法编译:您无法在界面上声明字段。你必须解决这个问题,因为根据你写的内容,答案是不同的(取决于现有的get和/或设置属性) – 2010-04-01 17:38:52

+0

你是否试图在界面上定义一个事件? – 2010-04-01 17:39:32

回答

0

它可以返回一类这个类型的,但必须满足ITimeEvent合同界面并返回它说它是ITimeEventHandler类型。建议您使用此类型的属性,并使用派生类型的后备字段。

2

编辑:以下同样适用于获取/设置属性,所以你不能在接口中声明字段的事实对于我所创造的点来说并不重要。

在你的情况,ITimeEvent.Handler是一个场,这意味着你可以做到以下几点:

ITimeEvent x = ...; 
IJobTimeEventHandler handler = ...; 
x.Handler = handler; 

如果x被分配(混凝土)的对象类型JobTimeEvent,并JobTimeEvent.Handler被宣布为JobTimeEventHandler,则上面的任务将失败。这是一个反例如何不是安全的分配操作的例子。

相反,如果你有以下:

interface ITimeEvent 
{ 
    IJobTimeEventHandler Handler { get; } 
} 

然后,你可以很容易地做到这一点:

class JobTimeEvent : ITimeEvent 
{ 
    private JobTimeEventHandler _handler; 

    public IJobTimeEventHandler Handler { get { return _handler; } } 
} 
0

如果你想你definded领域,真正成为你可以做这样的事情的性质。 ..

public interface ITimeEvent 
{ 
    ITimeEventHandler Handler { get; set; } 
} 
public interface IJobTimeEvent : ITimeEvent 
{ 
    int JobID { get; set; } 
} 

public class JobTimeEvent : IJobTimeEvent 
{ 
    public JobTimeEvent() 
    { 
     //these are currently useless because they are the default values 
     this.JobID = 0; 
     this.Handler = null; 
    } 
    public int JobID { get; set; } 
    public ITimeEventHandler Handler { get; set; } 
} 

...如果你正在尝试做一些不同的事情,你将需要提供mo关于你的问题的细节。

相关问题