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

Я думаю, это то, что вы ищете: https://www.stateofthedapps.com

DApp является аббревиатурой для децентрализованного приложения, которое включает в себя внешний интерфейс и интеллектуальный контракт в качестве бэкэнда.

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

216
задан Eoin Campbell 21 April 2009 в 08:26
поделиться

6 ответов

Цитирование из здесь :

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

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

(Mads Torgersen , C # Language PM)

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

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

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

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

(littleguru)

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

Вот почему переопределение не работает со статическими методами / свойствами / событиями ...

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

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

(littleguru)

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

Вот почему переопределение не работает со статическими методами / свойствами / событиями ...

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

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

(littleguru)

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

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

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

(littleguru)

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

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

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

(littleguru)

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

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

(littleguru)

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

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

(littleguru)

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

168
ответ дан 23 November 2019 в 04:19
поделиться

Основная причина того, что вы не можете наследовать статический класс, заключается в том, что они абстрактны и запечатаны (это также предотвращает создание любого их экземпляра).

Итак, это:

static class Foo { }

компилируется в этот IL:

.class private abstract auto ansi sealed beforefieldinit Foo
  extends [mscorlib]System.Object
 {
 }
70
ответ дан 23 November 2019 в 04:19
поделиться

Подумайте об этом так: вы получаете доступ к статическим членам через имя типа, например:

MyStaticType.MyStaticMember();

Если бы вы наследовали от этого класса, вы должны были бы получить доступ к нему через новое имя типа:

MyNewType.MyStaticMember();

Таким образом, новый элемент не имеет отношения к оригиналу при использовании в коде. Не было бы никакого способа использовать в своих интересах какие-либо отношения наследования для таких вещей, как полиморфизм.

Возможно, вы думаете, что вы просто хотите расширить некоторые элементы в исходном классе. В этом случае ничто не мешает вам использовать элемент оригинала в совершенно новом виде.

Возможно, вы хотите добавить методы к существующему статическому типу. Вы можете сделать это уже с помощью методов расширения.

Возможно, вы хотите иметь возможность передавать статический тип в функцию во время выполнения и вызывать метод этого типа, не зная точно, что делает метод. В этом случае вы можете использовать интерфейс.

Итак, в конце концов, вы ничего не получите от наследования статических классов.

24
ответ дан 23 November 2019 в 04:19
поделиться

What you want to achieve by using class hierarchy can be achieved merely through namespacing. So languages that support namespapces ( like C#) will have no use of implementing class hierarchy of static classes. Since you can not instantiate any of the classes, all you need is a hierarchical organization of class definitions which you can obtain through the use of namespaces

3
ответ дан 23 November 2019 в 04:19
поделиться

Несмотря на то, что вы можете получить доступ к «унаследованным» статическим членам через имя унаследованного класса, статические члены на самом деле не наследуются. Это частично, почему они не могут быть виртуальными или абстрактными и не могут быть переопределены. В вашем примере, если вы объявили Base.Method (), компилятор все равно отобразит вызов Inherited.Method () обратно в Base.Method (). Вы также можете явно вызвать Base.Method (). Вы можете написать небольшой тест и просмотреть результат с помощью Reflector.

Итак ... если вы не можете наследовать статические члены, и если статические классы могут содержать только только статических членов, что хорошего будет в наследовании статический класс делать?

2
ответ дан 23 November 2019 в 04:19
поделиться

Хммм ... было бы совсем иначе, если бы у вас были только нестатические классы, заполненные статическими методами ..?

1
ответ дан 23 November 2019 в 04:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: