2

我正在使用接口引用变量来访问接口上的属性

但除此之外,实现接口的类还有自己的属性。

我无法通过此接口引用访问类属性。

以下是我的问题:

1)为什么会这样?

2)问题的解决方案是什么?有什么方法可以仅通过机器访问 AC 类的冷却剂功率变量吗?TYPE CAST 会起作用吗?

 interface IMachines
{
    #region properties
    int machineID { get; set; }
    static int totalID { get; set; }
    string name { get; set; }
    string make { get; set; }
    int weight { get; set; }
    int cost { get; set; }
    int warranty { get; set; }
    DateTime creationDate { get; set; }
    #endregion

    int generateWarrantyExpiry();
    int searchMachine();
}

public class AC:IMachines
{
    #region ACMembers

    protected int _machineID;
    protected string _name;
    protected int _weight;
    protected string _make;
    protected DateTime _creationDate;
    protected int _warranty;
    protected int _cost;
    public int _coolentPower;

    public int CoolentPower
    {
        get { return _coolentPower; }
        set { _coolentPower = value; }
    }

    #endregion




    #region IMachines Members

    public int machineID
    {
        get { return _machineID; }
        set { _machineID = value; }
    }

    public string name
    {
        get { return _name; }
        set { _name = value; }
    }

    public string make
    {
        get { return _make; }
        set { _make = value; }
    }

    public int weight
    {
        get { return _weight; }
        set { _weight = value; }
    }

    public int cost
    {
        get { return _cost; }
        set { _cost = value; }
    }

    public int warranty
    {
        get { return _warranty; }
        set { _warranty = value; }
    }

    public DateTime creationDate
    {
        get { return _creationDate; }
        set { _creationDate = value; }
    }

    public int searchMachine()
    {
        //Search machine logic to be implemented
return 2
    }

    public void GenerateWarranty()
{
//generate warranty logic to be implemented

}

    #endregion
}

}

4

7 回答 7

1

是的,您可以使用“as”关键字尝试转换为 AC 类:

IMachines machines = new AC();
(machines as AC).CoolentPower = 3;
于 2012-05-23T12:18:14.427 回答
1

请注意,正如许多回答者所建议的那样,使用强制转换会破坏IMachines接口提供的抽象。

如果您确实只使用实现接口的一种类型AC,那么这将起作用,但如果您想要支持其他类型的IMachines,事情可能会失败。

于 2012-05-23T12:23:19.443 回答
1

以这种方式使用接口的有趣之处之一是能够检查泛型变量是否实现了接口。例如,您有一个在较低级别运行的通用函数。如果您获得的对象实现了 IMachines,请对其执行一些特殊或附加的操作。

public void DOSTUFF (object myobject)
{
    IMachines machine = myobject as IMachines;
    if (machine != null)
    {
        //do something special for IMachine objects
    }

    //the rest of the function that gets run against everything
}

是的,要访问接口中未定义的类部分,您必须直接转换为类型,而不是使用接口。

于 2012-05-23T12:34:30.763 回答
1

这是为什么?

接口是合同的声明。您是说实现类型符合该合同。

当使用接口访问属性时,您只能访问接口声明的那些属性——接口如何“知道”这些属性?它需要“知道”实现它的所有类型以及您的确切意思。

解决方案是在需要接口抽象时使用接口,在需要使用类型及其所有定义的属性时使用具体类型。

于 2012-05-23T12:38:46.433 回答
0

有一个解决方案,它调用CAST.

因此,转换为类的类型实现它以访问 inetrface 本身中不存在的属性/方法。

var machine = (AC)interfaceVar;
machine.CoolentPower

或者,只需使用动态

dynamic machine = interfaceVar; //no cast needed ! non need to "know" actual type
machine.CoolentPower
于 2012-05-23T12:16:17.403 回答
0

如果你转换它,你可以访问你的类的属性。

var cool = machine as AC;
于 2012-05-23T12:16:44.173 回答
0

回答 1 - 因为接口定义了类将实现的契约,因此只要契约(即接口)保持不变,您就可以更改实现。您要做的是获取不属于合同一部分的属性-如果您可以访问 AC 类的属性,但有人传入了实现 IMachine 但没有的 MachineX 实例,您会期望发生什么有你的 AC 类的属性吗?编译器无法猜测在这种情况下要做什么,因此您必须明确告诉它,如果您的机器是 AC,则将其作为 AC 做一些事情(这就是其他关于强制转换它的答案)。

于 2012-05-23T12:21:37.933 回答