对接口的简要理解

本文关键字:接口 | 更新日期: 2023-09-27 17:50:31

我有一个接口,上面写着setMaster((;以及2个类,我基于该场景从中设置相应的母版页。

我需要理解以下代码的含义:

 Control pageControl = LoadControl(pageControlPath);
 if (pageControl is IVariableMasterPageControl)
 {
     ((IVariableMasterPageControl)pageControl).setMaster();
 }

我的代码:

接口:

interface IVariableMasterPageControl
{
    void setMaster();
}

类别:

public class VariableMasterControl1 : System.Web.UI.UserControl, IVariableMasterPageControl
{
    public void setMaster()
    {
        this.Page.MasterPageFile = ("~/ui/" + SiteConfiguration.UIID + "/MasterPageOne.Master");
    }
}

对接口的简要理解

显示的代码动态加载UserControl。对LoadControl方法的调用返回一个类型为Control的实例。这可以是可能实现也可能不实现接口IVariableMasterPageControl的任何控件。因此,如果要调用setMaster方法,则在访问接口上的控件之前,需要检查控件是否实现了接口。这就是if语句正在执行的操作。

is语句检查对象是否与给定类型兼容,以便将其强制转换为该类型。在您的情况下,线

if (pageControl is IVariableMasterPageControl)

检查CCD_ 7是否实现CCD_。

由于之后需要对接口的引用,因此可以使用as运算符:

Control pageControl = LoadControl(pageControlPath);
var varMasterPageCtrl = pageControl as IVariableMasterPageControl;
if (varMasterPageCtrl != null)
    varMasterPageCtrl.setMaster();

在我看来,您正在执行自定义ASCX控件,其中一些控件实现了接口IVariableMasterPageControl。您很难理解的代码是检查有问题的控件是否实现了接口。如果它这样做了,它就会访问控件的方法setMaster((——这显然是必须实现的。

代码

if(pageControl为IVariableMasterPageControl(

是检查控件是否真的实现了接口的部分。这也可以通过以下方式来实现;

if(pageControl.GetType((==(IVariableMasterPageControl(的类型(

看看这个链接:如何比较类型。可以帮助你比较类型并更深入地理解这个概念。

在这种情况下,is关键字基本上说:"如果PageControl的这个实例实现了接口IVariableMasterPageControl,那么为该PageControl调用接口的SetMaster()方法。">

使用is关键字进行检查可以确保对象实际上要调用的方法SetMaster()。您可以遍历一堆PageControl对象,但不能保证所有对象都能实现接口。在没有检查的情况下调用不存在的方法肯定会导致Exception,甚至可能调用错误的代码(例如,如果其中一个PageControl对象实现了另一个接口,恰好也定义了方法SetMaster()(。