Невозможно создать экземпляр абстрактного класса или интерфейса - PullRequest
2 голосов
/ 28 июля 2011

Я не знаком с использованием abstract class.

Я пытаюсь вызвать abstract class и получить эту ошибку Cannot create an instance of the abstract class or interface, и я уже изучаю эту ошибку, но я действительно запутался в этом.

Вот мой код:

        string B1String;
        while ((B1String = OasisFile.ReadLine()) != null)
        {
          Questions_Base oQuestions_Base = new Questions_Base(); // error here
          oQuestions_Base.Import(B1String);
        }

Пожалуйста, посоветуйте мне .. спасибо!

Ответы [ 8 ]

8 голосов
/ 28 июля 2011

Цель абстрактного класса - служить частью иерархии классов, где более производные классы имеют общую реализацию.

Если у вас есть симулятор полета, вы можете определить абстрактный класс ThingsThatFly, который реализует некоторые свойства (скорость полета, высоту, курс) и методы (TakeOff (), Land ()), которые объединяют все летающие объекты, но будет объявлено abstract , потому что ThingsThatFly - это абстракция всех конкретных летающих вещей. Конечно, у вас могут быть и промежуточные классы, например, Cessna172 может наследоваться от Airplane, который наследуется от ThingsThatFly. Вы бы сделали это, если бы все самолеты имели общую реализацию, например, птицы не имеют (например, свойство оставшегося топлива).

Тогда у вас будет несколько конкретных (= реальных) вещей, которые летают как Cessna 172, космический челнок и утка. Каждый из них будет конкретным классом, производным от ThingsThatFly

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

3 голосов
/ 28 июля 2011

Вы не можете создать экземпляр абстрактного класса.

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

3 голосов
/ 28 июля 2011

Абстрактный класс может быть унаследован только.

public class CustomClass : Questions_Base {
}

Вот ссылка все об абстрактных классах и их использовании.

2 голосов
/ 28 июля 2011

Абстрактный класс - это класс, который ДОЛЖЕН наследоваться.

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

Вы должны просто иметь возможность удалить работу kwy "abstract" из определения вашего класса Questions_Base или создать новое определение класса, которое наследуется от него.

2 голосов
/ 28 июля 2011

Из документации: «Ключевое слово abstract позволяет создавать классы и члены класса, которые являются неполными и должны быть реализованы в производном классе».

Цель использования abstract - в точности предотвратить создание экземпляров, посколькувы только создали класс для использования в качестве базового класса и никогда не хотите, чтобы был создан экземпляр.

Подробнее здесь .

2 голосов
/ 28 июля 2011

Абстрактный класс не может быть создан. Вы должны предоставить реализацию для класса.

    abstract class Animal
    {
        public abstract void Speak() { }
    }

    public class Dog : Animal
    {
        public override void Speak()
        {
            Console.WriteLine("Woof");
        }
    }

См. MSDN на аннотации для получения дополнительной информации

2 голосов
/ 28 июля 2011
  1. Abstract класс сделан переопределенным производным классом. Если вам нужен класс Abstract, сначала создайте из него класс s Derived и используйте конструктор классов Derived.
  2. Если это не важно, просто удалите abstract word из Questions_Base объявления класса, чтобы сделать его неабстрактным. Кроме того, поскольку в предоставленном коде я не вижу ни одного члена abstract, поэтому, возможно, этот вариант является правильным.

Привет.

0 голосов
/ 28 июля 2011

Абстрактные классы, помеченные ключевым словом abstract в определении класса, обычно используются для определения базового класса в иерархии.Что особенного в них, это то, что вы не можете создать их экземпляр - если вы попытаетесь, вы получите ошибку компиляции.Вместо этого вы должны разделить их на подклассы, как описано в главе о наследовании, и создать экземпляр вашего подкласса.Итак, когда вам нужен абстрактный класс?Это действительно зависит от того, что вы делаете.Если честно, вы можете пройти долгий путь, не нуждаясь в абстрактном классе, но они отлично подходят для конкретных вещей, таких как фреймворки, поэтому вы найдете немало абстрактных классов в самой .NET-фреймворке.Хорошее эмпирическое правило заключается в том, что имя на самом деле имеет действительно хороший смысл - абстрактные классы очень часто, если не всегда, используются для описания чего-то абстрактного, чего-то большего, чем концепция, а не реальная вещь.

...