1

次の C# コードを実行すると、BaseClass() called理解できる のみが出力されます。BaseClass.CreateInstance()ただし、実際にはそのメソッドを継承する別のクラスであっても、呼び出されているクラスのインスタンスを常に返したい場合はどうすればよいでしょうか?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Example
{
    class BaseClass
    {
        public BaseClass()
        {
            Console.WriteLine("BaseClass() called");
        }

        public static BaseClass CreateInstance()
        {
            return new BaseClass();
        }
    }

    class DerivedClass : BaseClass
    {
        public DerivedClass()
            : base()
        {
            Console.WriteLine("DerivedClass() called");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            DerivedClass.CreateInstance();
            Console.ReadLine(); //pause so output is readable
        }
    }
}
4

2 に答える 2

3

あなたは実際にそれを呼び出していませんDerivedClass。コンパイラは、静的メソッドが on BaseClass(およびないDerivedClass) にあることを確認し、それを への呼び出しに自動的に変換しBaseClass.CreateInstanceます。

1 つのオプションは、ジェネリックを使用してこれを処理することです。

public static T CreateInstance<T>() where T : BaseClass, new()
{
    return new T();
}

これにより、次のように記述できます。

DerivedClass dc = BaseClass.CreateInstance<DerivedClass>();
于 2013-09-25T20:44:39.957 に答える
0

DerivedClassメソッドでのインスタンスを作成していないため、インスタンスをCreateInstance取得していないため、コンストラクターは呼び出されません。

あなたがそうするならvar bla = new DerivedClass()、それはそのコンストラクターを呼び出します。

于 2013-09-25T20:43:14.990 に答える