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多くの回答者が示唆しているように、キャストを使用すると、インターフェースによって提供される抽象化が壊れることに注意してください。

インターフェースを実装する 1 つのタイプのみを使用することが事実である場合、ACこれは機能しますが、他のタイプの をサポートしたい場合は、問題IMachinesが発生する可能性があります。

于 2012-05-23T12:23:19.443 に答える
1

このようにインターフェイスを使用することの楽しい点の 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

1への回答-インターフェースはクラスが実装するコントラクトを定義するため、コントラクト(つまりインターフェース)が同じである限り、実装を変更できます。あなたがやろうとしているのは、コントラクトの一部ではないプロパティに到達することです-ACクラスのプロパティにアクセスできたが、誰かがIMachineを実装しているが実装していないMachineXのインスタンスを渡した場合、どうなると思いますかあなたのACクラスの特性を持っていますか?コンパイラはそのような場合に何をすべきかを推測できないため、マシンがACの場合は、ACとして何かを実行するように明示的に指示する必要があります(これは、キャストに関する他の回答です)。

于 2012-05-23T12:21:37.933 に答える
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 に答える