Как может статический класс получить объект?

Я пытаюсь наследовать нестатический класс статическим классом.

public class foo
{ }

public static class bar : foo
{ }

И я получаю:

Статический класс не может быть получен из типа. Статические классы должны быть получены из объект.

Как я могу получить его из объекта?

Код находится в С#.

Ответ 1

Нет значения при выводе статических классов. Причины использования наследования:

  • Полиморфизм
  • Повторное использование кода

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

Повторное использование кода легко решить с помощью композиции: дать Bar статический экземпляр Foo.

Ответ 2

Из спецификации С# 3.0, раздел 10.1.1.3:

Статический класс может не включать базовая спецификация класса (§10.1.4) и не может явно указать базовый класс или список реализованных интерфейсов. статический класс неявно наследует введите object.

Другими словами, вы не можете этого сделать.

Ответ 3

Сообщение об ошибке является фиктивным. Это не говорит "объект". Он говорит о встроенном типе, называемом "объектом", который является основой всего в .NET.

Он должен сказать, что "статические классы не могут указывать базовый тип".

Ответ 4

Взято из http://msdn.microsoft.com/en-us/library/79b3xss3(VS.80).aspx

Основные функции статического класса являются:

Они содержат только статические элементы.

Они не могут быть созданы.

Они запечатаны.

Они не могут содержать экземпляр Конструкторы (Руководство по программированию на С#).

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

Ответ 5

Я не думаю, что С# поддерживает наследование для статических классов.

Один вариант - использовать шаблон singleton вместо

public class foo
{ }

public class bar : foo
{
    private bar instance;
    public bar GetInstance()
    {
        if(instance == null) instance = new bar();
        return instance;
    }

    private bar(){} //make default constructor private to prevent instantiation 
}

Ответ 6

Как уже говорилось ранее, спецификация С# говорит, что этого не может быть сделано. Вы также не можете реализовать интерфейс со статическими классами. Лучше всего перейти от использования статического класса к использованию класса, который использует шаблон singleton. У вас будет только один экземпляр (подобно тому, как работает статический класс), и вы сможете наследовать поведение или реализовывать интерфейсы.

Вы читаете в Singletons здесь, здесь и здесь.

Ответ 7

Не все ли классы (статические включены) уже получены из объекта? Как по умолчанию?

Кроме того, как говорится, "статический класс не может быть получен из типа". Поэтому я не думаю, что вы делаете это. Почему вы хотите, чтобы статический класс получался из какого-либо типа?

Ответ 8

Он не может. Вы должны создать нормальный класс для вывода из другого класса.

Ответ 9

Все классы выводятся неявно из Object. Тем не менее, хотя статические классы (которые по определению являются просто контейнерами для статических членов) "выводятся" из объекта, вы ничего не можете получить от этого факта.

Ответ 10

Сообщение об ошибке вводит в заблуждение.

bar не может наследовать от foo, потому что foo может быть создан, а bar не может.

Ответ 11

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

Ответ 12

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

статический класс может быть унаследован только из класса "object" (базовый класс .net).

Дополнительная информация: Все классы в .net унаследованы от класса "object", даже любой статический класс.

Разница даже в том, что статический класс наследует "класс объекта", он наследует только два статических метода из класса "объект".

Другие нестатические классы наследуют другие четыре метода.

Ответ 13

Как сказано в другом ответе, сообщение компилятора вводит в заблуждение, но верно. Вы можете написать:

static class A : object
{
}

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

    static class A : object
    {
        public static new string ToString()
        {
            return "I am object A";
        }

        public static new int GetHashCode()
        {
            return ToString().GetHashCode();
        }
    }

Ответ 14

Как отметил Кристофер, предположим, что мы можем вывести статический класс из нестатического класса.

например:

public class foo
{
    public int myVar;
}

public static class bar : foo { }

здесь, bar класс, полученный из foo, поэтому статический класс Бар имеет нестатический член myVar., и согласно спецификации С#, Static Class не может содержать нестатические элементы!