0

これがユニティのバグかどうかはわかりませんが、3番目のケースで以下のプログラムが150を出力する理由を説明してくれる人はいますか?

void Main()
{
// Test 1
Derived d = new Derived();
d.Height.Dump(); //Prints 10

// Test 2
IUnityContainer unityContainer = new UnityContainer();
unityContainer.Resolve(typeof(Derived)).Dump(); // Prints 10

// Test 3 
unityContainer.RegisterType<IPrintHeightService<Derived>, PrintHeightService<Derived>>();
var output = unityContainer.Resolve<IPrintHeightService<Derived>>();
output.Show(); //Prints 150
}


public interface IHasHeight
{
    Int32 Height {get; set;}
}

// Define other methods and classes here
public class Default : IHasHeight
{
    public Int32 Height {get; set;}

    public Default()
    {
        Height = 150;
    }
}

public class Derived : Default
{
    public new Int32 Height {get { return 10;}}
}


public interface IPrintHeightService<T> where T:IHasHeight, new() 
{
    void Show();
}

public class PrintHeightService<T> : IPrintHeightService<T> where T:IHasHeight, new()
{
    private IHasHeight objectWithHeight;
    public PrintHeightService(IUnityContainer unityContainer)
    {
        objectWithHeight = (T) unityContainer.Resolve(typeof(T));
    }

    public void Show()
    {
        Console.WriteLine(objectWithHeight.Height); // Prints 150
    }
}

これは、説明したように初期化子が派生からベースに実行されるためだと思われます (http://blogs.msdn.com/b/ericlippert/archive/2008/02/18/why-do-initializers-run-in-the -opposite-order-as-constructors-part-two.aspx) しかし、それが団結で明らかであり、それ以外ではないのはなぜですか?

どうもありがとう。

4

1 に答える 1

4

これは、Heightをとして宣言したためですnew。として宣言することによりnew、DerivedはHeightをオーバーライドせず、単に非表示にします。それは初期化子とは何の関係もありません。

つまり、新しい実装は、インターフェイスによって宣言された仮想プロパティとは何の関係もありません。たまたま同じ名前を持っているため、「非表示」になっています。IHasHeight(そのタイプのフィールドにアクセスするShow()方法で) Height overを呼び出すことにより、インターフェースによって宣言されたプロパティが呼び出されます。これは、に実装されています。タイプの参照を介して呼び出す場合にのみ、を取得します。PrintHeightServiceDefaultDerived.HeightDerived

d自分で確認できます。例1の変数のタイプをDefaultまたはに変更するIHasHeightと、150も取得されることがわかります。

Height本当にinの実装をオーバーライドしたい場合Derived

  • のように宣言HeightvirtualDefaultから
  • Heightのようoverrideに宣言するDerived
  • そして、new修飾子を削除します。
于 2012-04-25T14:14:45.157 に答える