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

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

30
задан Mentatmatt 2 October 2013 в 09:11
поделиться

7 ответов

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

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

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

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

29
ответ дан 27 November 2019 в 23:31
поделиться

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

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

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

7
ответ дан 27 November 2019 в 23:31
поделиться

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

Пример: представьте, что у вас сложное приложение, в которое пользователи могут входить. Должны быть доступны различные механизмы аутентификации, скажем, 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
ответ дан 27 November 2019 в 23:31
поделиться

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

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

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

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

6
ответ дан 27 November 2019 в 23:31
поделиться

Вот краткое описание:

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

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

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

22
ответ дан 27 November 2019 в 23:31
поделиться

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

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

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

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

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

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

public void abcd(){}

public static void main(String[] args) {

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

}

}

Только внутренний класс может быть объявлен как «Статический», см. Код ниже. Верхний / инкапсулирующий класс не может быть объявлен как «Статический». Доступ к нему можно получить, используя верхнюю / инкапсулирующую переменную класса.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");
    }
}

}

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

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