Подтвердить что ты не робот

Какая разница между абстрактным классом и статическим?

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

4b9b3361

Ответ 1

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

Здесь более подробная информация об использовании статических членов и классов.

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

Здесь более подробная информация об использовании тезисов.

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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) {
        ...
    }
}

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

Ответ 7

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

Но также можно объявить класс как "Абстрактное" без применения в нем абстрактного метода (ов). См. Образец ниже.

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

public void abcd(){}

public static void main(String[] args) {

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

}

}

Только внутренний класс может быть объявлен как "Статический", см. код ниже. Верхний/инкапсулирующий класс не может быть объявлен как "Статический". Доступ к ней можно получить, используя верхнюю/инкапсулирующую переменную класса .Static-inner-classname i.e, как и любой вызов статического метода с использованием имени класса.

открытый класс 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");
    }
}

}

Ответ 8

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

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

Ответ 9

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

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

Философия за "абстрактными" классами капитализирует все общие черты всех расширенных классов в одном месте.

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