当实现接口的类具有自己的属性时如何使用接口
本文关键字:接口 属性 自己的 何使用 实现 | 更新日期: 2023-09-27 18:35:09
我正在使用接口引用变量来访问接口上的属性
但除此之外,实现接口的类具有自己的属性。
我无法通过此接口引用访问类属性。
以下是我的问题:
1)为什么会这样?
2)问题的解决方案是什么?有什么方法可以仅通过机器访问AC级的冷却液功率变量吗?类型转换会起作用吗?
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
}
}
请注意,正如许多回答者所建议的那样,使用强制转换将破坏IMachines
接口提供的抽象。
如果您确实只会使用实现接口的一种类型,AC
,那么这将起作用,但是如果您想支持其他类型的IMachines
,事情可能会崩溃。
是的,您可以使用"as"关键字尝试转换为AC类:
IMachines machines = new AC();
(machines as AC).CoolentPower = 3;
以这种方式使用接口的一个有趣的事情是能够检查泛型变量是否实现了接口。 例如,您有一个在较低级别运行的泛型函数。 如果你得到的对象实现了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
}
是的,要访问未在接口中定义的类部分,您必须直接强制转换为类型,而不是使用接口。
为什么?
接口是合约的声明。您是说实现类型符合该协定。
使用接口访问属性时,只能访问接口声明的那些属性 - 接口如何"知道"这些属性?它需要"知道"实现它的所有类型以及你到底指的是哪一种。
解决方案是在需要接口抽象时使用接口,在需要使用类型及其所有定义的属性时使用具体类型。
有一个解决方案,它调用CAST
.
因此,强制转换为类的类型可以实现它以访问 intrface 本身中不存在的属性/方法。
var machine = (AC)interfaceVar;
machine.CoolentPower
或者,简单地使用动态
dynamic machine = interfaceVar; //no cast needed ! non need to "know" actual type
machine.CoolentPower
如果你强制转换它,你可以访问你的类的属性。
var cool = machine as AC;
回答 1 - 因为接口定义了类将实现的合约,因此只要合约(即接口)保持不变,您就可以更改实现。 您正在尝试做的是获取不属于合约的属性 - 如果您可以访问 AC 类的属性,但有人传入了实现 IMachine 但没有 AC 类属性的 MachineX 实例,您会期望会发生什么?编译器无法猜测在这种情况下该做什么,因此您必须明确告诉它,如果您的机器是 AC,则将其作为 AC 执行某些操作(这就是关于强制转换它的其他答案所做的)。