Наследование не работает должным образом для универсальных фабрик абстрактных объектов - PullRequest
1 голос
/ 10 октября 2011

У меня есть следующая базовая фабрика объектов, когда я хочу, чтобы у некоторых членов иерархии классов был специальный код построения, а у любых других членов - универсальные конструкторы.

Моя проблема в том, что TileFactory не имеет метода GetInstance - моя программа не будет компилироваться, если я попытаюсь вызвать TileFactory.GetInstance ().Любой совет?

 public static class ObjectFactory<K>
        {
            public static T GetInstance<T>() where T : K
            {
                T obj = (T)Activator.CreateInstance(typeof(T));
                return obj;
            }
//snip
            }

        }
//snip
        public static class TileFactory : ObjectFactory<Tile>
        {
        }

Ответы [ 2 ]

4 голосов
/ 10 октября 2011

Почему я не могу наследовать статические классы?

Цитата отсюда:

Это на самом деле дизайн.Кажется, нет веской причины наследовать статический класс.Он имеет открытые статические члены, к которым вы всегда можете получить доступ через само имя класса.Единственными причинами наследования статических объектов, которые я видел, были плохие, такие как сохранение пары символов при наборе текста.

Возможно, есть причина рассмотреть механизмы, позволяющие вводить статические элементы непосредственно в область видимости (и мыФакт, рассмотрим это после цикла продуктов Orcas), но наследование статического класса - не тот путь: это неправильный механизм, и он работает только для статических членов, которые находятся в статическом классе.

(Mads Torgersen, C # Language PM)

Другие мнения из channel9

Наследование в .NET работает только на базе экземпляров.Статические методы определяются на уровне типа, а не на уровне экземпляра.Вот почему переопределение не работает со статическими методами / свойствами / событиями ...

Статические методы хранятся в памяти только один раз.Для них не создано виртуальной таблицы и т. Д.

Если вы вызываете метод экземпляра в .NET, вы всегда указываете ему текущий экземпляр.Это скрыто во время выполнения .NET, но это происходит.Каждый метод экземпляра имеет в качестве первого аргумента указатель (ссылку) на объект, на котором выполняется метод.Этого не происходит со статическими методами (так как они определены на уровне типа).Как компилятор решит выбрать метод для вызова?

(littleguru)

И как полезная идея, у littleguru есть частичный «обходной путь» для этой проблемы: шаблон Singleton.

http://www.dofactory.com/Patterns/PatternSingleton.aspx

2 голосов
/ 10 октября 2011

Нет наследования для статических вещей. Обходной путь - использовать синглтоны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...