Об абстрактных классах? - PullRequest
2 голосов
/ 15 мая 2010

URL: Ссылка (1)

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

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

Но на MSDN

URL: TextWriter CLass на MSDN

TextWriter является абстрактным классом, но в нем определены два конструктора ... и, согласно книге MS 70-536, допустимо следующее утверждение:

TextWriter tw = new File.CreateText("myFile.Txt")

Класс статического файла и его метод CreateText мне подходят, так как я изучал его на MSDN, но кто-нибудь может объяснить это маленькое противоречие, которое я нашел? Неужели я не первый?

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

Ответы [ 7 ]

4 голосов
/ 15 мая 2010

File.CreateText возвращает не TextWriter, а StreamWriter, который реализует TextWriter.

3 голосов
/ 15 мая 2010

Все абстрактные классы имеют как минимум один конструктор - либо вы реализуете его, либо компилятор генерирует конструктор по умолчанию без параметров. Конструктор выполняется при создании экземпляра производного класса - не имеет значения, что базовый класс является абстрактным.

Но вы не можете создать экземпляр абстрактного класса - File.CreateText() является статическим методом и возвращает экземпляр класса, производный от TextWriter, но не экземпляр TextWriter.

3 голосов
/ 15 мая 2010

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

Однако я с подозрением отношусь к новому ключевому слову. Вы уверены, что это работает? Это не должно File.CreateText создает и возвращает (то, что наследует) TextWriter, но new указывает конструктор, а это не то, что происходит.

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

Это невозможно.

Что происходит (когда вы удаляете ключевое слово new, чтобы заставить код работать вообще), метод CreateText создает экземпляр StreamWriter, который наследует TextWriter. Ссылка StreamWriter присваивается переменной TextWriter, которая действительна, поскольку StreamWriter является TextWriter.

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

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

Магия полиморфизма / наследования.

File.CreateText возвращает StreamWriter, который наследуется от TextWriter.

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

Реализация File.CreateText создает и возвращает тип, который является конкретной реализацией TextWriter. То есть Какой бы тип не был возвращен - это TextWriter - это не волшебное создание абстрактного класса.

Хотя вы не можете создать абстрактный класс, вы можете без проблем ссылаться на него как на экземпляр производного типа по его базовому типу. Если бы вы не могли этого сделать, то полиморфизм был бы довольно бесполезен!

0 голосов
/ 15 мая 2010

CreateText возвращает StreamWriter

public static StreamWriter CreateText(string path)

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

...