经常看到如果实现了xx接口,就会成为某种特定的类型,而拥有某些功能。比如icomponent接口是所有组件类的接口,提供所有组件需要的功能,但我用
Implements System.ComponentModel.IComponent 实现这个接口,就2个dispose方法和一个属性
Public Property Site() As System.ComponentModel.ISite Implements System.ComponentModel.IComponent.Site
        Get        End Get
        Set(ByVal value As System.ComponentModel.ISite)        End Set
    End Property这就是能实现所有组件所需功能的一个属性?有点迷糊,关于实现接口而拥有某种功能在脑子里不能形成轮廓,谁能帮忙指点一二

解决方案 »

  1.   

    再举个例子,实现了idisposable接口的类能在end using 中自动销毁,但 
    If disposing Then
     ' TODO: put code to dispose managed resources
    End If这里明明啥都没写,为什么不提供现实代码接口就能工作了呢?? Implements IDisposable    Private disposed As Boolean = False    ' IDisposable
        Private Overloads Sub Dispose(ByVal disposing As Boolean)
            If Not Me.disposed Then
                If disposing Then
                    ' TODO: put code to dispose managed resources
                End If            ' TODO: put code to free unmanaged resources here
            End If
            Me.disposed = True
        End Sub#Region " IDisposable Support "
        ' This code added by Visual Basic to correctly implement the disposable pattern.
        Public Overloads Sub Dispose() Implements IDisposable.Dispose
            ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub    Protected Overrides Sub Finalize()
            ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
            Dispose(False)
            MyBase.Finalize()
        End Sub
      

  2.   

    换个C#的版本说,VB.NET实在不够熟(转自C#高级编程第三版)释放类所使用的未托管资源的两种方式:
    利用运行库强制执行的析构函数,但析构函数的执行是不确定的,而且,由于垃圾收集器的工作方式,它会给运行库增加不可接受的系统开销。
    IDisposable接口提供了一种机制,允许类的用户控制释放资源的时间,但需要确保执行Dispose()。
    一般情况下,最好的方法是执行这两种机制,获得这两种机制的优点,克服其缺点。假定大多数程序员都能正确调用Dispose(),实现IDisposable接口,同时把析构函数作为一种安全的机制,以防没有调用Dispose()。下面是一个双重实现的例子可以看出,Dispose()有第二个protected重载方法,它带一个bool参数,这是真正完成清理工作的方法。Dispose(bool)由析构函数和IDisposable.Dispose()调用。这个方式的重点是确保所有的清理代码都放在一个地方。传递给Dispose(bool)的参数表示Dispose(bool)是由析构函数调用,还是由IDisposable.Dispose()调用——Dispose(bool)不应从代码的其他地方调用,其原因是:●       如果客户调用IDisposable.Dispose(),该客户就指定应清理所有与该对象相关的资源,包括托管和非托管的资源。●       如果调用了析构函数,在原则上,所有的资源仍需要清理。但是在这种情况下,析构函数必须由垃圾收集器调用,而且不应访问其他托管的对象,因为我们不再能确定它们的状态了。在这种情况下,最好清理已知的未托管资源,希望引用的托管对象还有析构函数,执行自己的清理过程。isDispose成员变量表示对象是否已被删除,并允许确保不多次删除成员变量。这个简单的方法不是线程安全的,需要调用者确保在同一时刻只有一个线程调用方法。要求客户进行同步是一个合理的假定,在整个.NET类库中反复使用了这个假定(例如在集合类中)。第15章将讨论线程和同步。最后,IDisposable.Dispose()包含一个对System.GC. SuppressFinalize()方法的调用。SuppressFinalize()方法则告诉垃圾收集器有一个类不再需要调用其析构函数了。因为Dispose()已经完成了所有需要的清理工作,所以析构函数不需要做任何工作。调用SuppressFinalize()就意味着垃圾收集器认为这个对象根本没有析构函数public class ResourceHolder : IDisposable
    {
        private bool isDispose = false;
        public void Dispose() 
        {
            Dispose(true);
            GC.SuppressFinalize(this); 
        }
        
        protected virtual void Dispose(bool disposing) 
        {
            if (!isDisposed)
            {
                if (disposing) 
                { 
                    //释放托管资源
                }
                //释放非托管资源
            }
            isDisposed=true;
       }   ~ResourceHolder()
       {
            Dispose (false);
       }
    }
      

  3.   

    If disposing Then
     ' TODO: put code to dispose managed resources
    End If
    =============================================这里是留下来让你自己写代码是放托管资源