В чем разница между абстрактным классом и статическим? - PullRequest
29 голосов
/ 06 марта 2010

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

Ответы [ 9 ]

28 голосов
/ 06 марта 2010

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

Подробнее об использовании статических членов и классов .

abstract s определяют базовую структуру и функциональность, общие для всех производных типов, но не могут использоваться сами по себе. Думайте о них, как я полагаю, как предварительный вариант и контракт. Это основная концепция ООП.

Подробнее об использовании тезисов .

21 голосов
/ 06 марта 2010

Вот краткое резюме:

  • Статический класс может содержать только static членов (это просто контейнер для методов, которые логически не относятся к экземпляру какого-либо стандартного класса)
  • Абстрактный класс может содержать все обычные виды членов (статические, абстрактные, а также экземпляры)

Ключевым отличием является то, что вы можете наследовать от abstract класса, но вы не можете наследовать от static класса. Технически говоря, среда выполнения .NET не имеет никакого понятия о static классах, поэтому компилятор C # компилирует их как классы abstract и sealed (то есть вы не можете наследовать от них).

Итак, static классы - это abstract классы, которые также sealed (хотя это не обычный способ взглянуть на проблему, если вы программист на C #) и содержат только static членов (что является обязательным) компилятором C #).

7 голосов
/ 06 марта 2010

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

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

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

6 голосов
/ 06 марта 2010

В CLR нет понятия о статических классах, оно специфично для C #. Компилятор реализует это путем легкого использования атрибутов CLR для класса: он объявляет его абстрактным и загерметизированным. Это препятствует тому, чтобы любой язык создал такой класс. Вот как это выглядит при запуске Ildasm:

.class public abstract auto ansi sealed beforefieldinit ConsoleApplication1.Test
       extends [mscorlib]System.Object
{
}

Создание этого запечатанного - очень важный момент статического класса, он используется в качестве контейнера для статических методов и полей. Это заставляет их действовать как глобальные переменные и функции, как у вас в таких языках, как C или Pascal.

Абстрактный класс - это нечто совершенно противоположное, он предназначен для того, чтобы быть производным от него. Абстрактный класс, который имеет all своего абстрактного члена, действует как интерфейс. В C # есть ключевое слово, что делает статический класс и интерфейс абсолютно противоположными.

2 голосов
/ 06 марта 2010

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

Пример. Предположим, у вас сложное приложение, в которое пользователи могут войти.Различные механизмы аутентификации должны быть применимы, скажем, LDAP, NTLM, вы называете это.Один из способов моделирования «пользователя» или «принципала» в таком контексте состоит в том, чтобы собрать, что является общим для всех этих механизмов, в абстрактный базовый класс и оставить «пробелы» (абстрактные методы), в которые входят реальные реализации.play:

abstract class Authenticator {

   protected Dictionary<string,User> userCache;

   ...

   public User LoadUser(string name) {
        User user;
        if( userCache.TryGet(name, out user) ) return user;
        else {
            user = LoadFromStore(name);
            userCache.Add(name, user);
            return user;
        }
   }

   protected abstract User LoadFromStore(string name);
}

Здесь кеширование пользователей является общей проблемой, смоделированной в базовом случае, в то время как фактическое извлечение оставлено для обеспечения подклассом.

Статический класс отличаетсяимеет значение в целом.По сути, это место для хранения ваших служебных функций:

static class StrUtil {

    public static string TrimWhitespace(string str) {
        ...
    }
}

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

2 голосов
/ 06 марта 2010

Абстрактные классы создаются косвенно через производные классы. Они обеспечивают общее поведение и состояние экземпляра, но сигнализируют о том, что требуется больше и должны предоставляться производными конкретными классами. Например, Transform может быть абстрактным классом: он объявляет общий метод Apply(Shape), но не реализует этот метод. Конкретные производные классы, такие как Rotation или Translation, будут реализовывать этот метод, и эти классы можно создать.

Статические классы не могут быть созданы, и любое состояние находится на уровне класса, а не на уровне экземпляра. Они обычно используются для определения служебных методов, когда с методами не связано состояние. Transform не может быть статическим классом, потому что конкретным производным классам нужно состояние для каждого экземпляра (например, Rotation требуется для каждого экземпляра Angle, потому что разные преобразования Rotation могут быть под разными углами). *

1 голос
/ 16 апреля 2018

Абстрактный класс (базовый класс): Позволяет другим классам наследовать от этого класса ( один класс получает свойства (методы и поля) другого ), но запрещает создать экземпляр т.е. мы не можем иметь объекты этого класса. http://csharp.net -tutorials.com / классы / абстрактные классы

Статический класс: Этот класс не может быть создан . Также этот класс не может быть унаследован . Чтобы получить доступ к методам этого класса, вы можете напрямую использовать classname.method. https://social.technet.microsoft.com/wiki/contents/articles/21028.difference-between-static-class-sealed-class-and-abstract-class-in-c.aspx

1 голос
/ 20 мая 2010

Основное назначение абстрактного класса - определить один или несколько абстрактных методов. Любой класс, расширяющий абстрактный класс, будет реализовывать абстрактный метод, иначе его также необходимо объявить как «абстрактный».

Но также возможно объявить класс как «Абстрактный», не реализовывая в нем никаких абстрактных методов. Смотрите образец ниже.

открытый абстрактный класс AbstractTest {

public void abcd(){}

public static void main(String[] args) {

      System.out.print("hi...");

}

}

Только внутренний класс может быть объявлен как «Статический», см. Код ниже. Верхний / инкапсулирующий класс не может быть объявлен как «Статический». Доступ к нему можно получить с помощью переменной Upper / encapsulation class. Static-inner-classname, т. Е. Аналогично любому вызову статического метода с использованием имени класса.

открытый класс StaticTest {

public static void main(String ag[]){
    System.out.println("hello...1");
    StaticTest.StaticTest2.meth2();
}

public static class StaticTest2 {
    public static void meth2(){
        System.out.print("hello...2");
    }
}

}

0 голосов
/ 21 сентября 2016

Основное различие между ними заключается в расширяемости.

CLR помечает все «статические» классы как « абстрактный и запечатанный » позади сцены (т. Е. Они не могут быть унаследованы, следовательно, не могут быть расширены), а .NET Framework CLR загружает их автоматически при загрузке программы или пространства имен. Это дает прирост производительности во время выполнения.

Философия, лежащая в основе «абстрактных» классов, состоит в том, чтобы использовать все общие черты всех расширенных классов в одном месте.

Надеюсь, это поможет.

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