Как статический класс может быть получен из объекта? - PullRequest
41 голосов
/ 17 февраля 2009

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

public class foo
{ }

public static class bar : foo
{ }

И я получаю:

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

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

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

Ответы [ 14 ]

51 голосов
/ 19 февраля 2009

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

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

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

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

23 голосов
/ 17 февраля 2009

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

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

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

13 голосов
/ 17 февраля 2009

Сообщение об ошибке является поддельным. Это не говорит "объект". Речь идет о встроенном типе, называемом «объект», который является основой всего в .NET.

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

8 голосов
/ 17 февраля 2009

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

Основные характеристики статического класса являются:

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

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

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

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

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

2 голосов
/ 17 февраля 2009

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

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

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 
}
1 голос
/ 05 января 2015

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

например:

public class foo
{
    public int myVar;
}

public static class bar : foo { }

здесь, bar класс, производный от foo , следовательно, статический класс Bar имеет нестатический член myVar сейчас и согласно Спецификация c #, Статический класс не может содержать нестатические члены!

1 голос
/ 17 февраля 2009

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

Вы читаете о синглетонах здесь , здесь и здесь .

0 голосов
/ 30 января 2012

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

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();
        }
    }
0 голосов
/ 27 июля 2011

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

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

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

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

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

0 голосов
/ 17 февраля 2009

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

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