@Got_Oxidus
Учусь

Как изменить тип параметра в унаследованном методе C#?

Задача:
В абстрактном классе Stream есть метод Stream.Read (Byte[], Int32, Int32). (Стандартный класс System.Stream).

Есть класс
class MyTCPStream : Stream

Вопрос: Как в MyTCPStream реализовать Read(char[], Int32, Int32), но не реализовывать Read (Byte[], Int32, Int32)?

P.S. Знаю, что для интерфейсных методом можно сделать так:
class E : IIF
{
  pubic string M1() {...}
  IIF.M1(){
  return (object)M1();
  }
}
  • Вопрос задан
  • 465 просмотров
Решения вопроса 1
Nipheris
@Nipheris Куратор тега C#
То, что вы просите, невозможно сделать по одной простой причине. Наследование в .NET бывает только "настоящее", т.е. когда устанавливается отношение is-a. Ваш MyTCPStream не может быть Stream-ом, если не реализует метод Read (Byte[], Int32, Int32). Спросите себя - что произойдёт, если я скастю объект MyTCPStream к Stream, и попытаюсь вызвать Read(Byte[]...)?

Вы конечно можете в теле метода бросить InvalidOperationException, но это однозначно признак неверно выбранной абстракции. Лично я не понимаю, зачем вам мог понадобиться TCPStream, из которого вы читаете не байты, а символы.

Для реализации процесса чтения более сложных объектов (а символ это более сложная штука, т.к. его представление в потоке зависит от кодировки) в дотнете есть TextReader и его наследники. Было бы хорошо, если б вы описали изначальную задачу - возможно мы посоветуем вам что-то полезное, а не странные хаки.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
abyrkov
@abyrkov
JavaScripter
Никак

Объясню.
Абстрактные классы, как, впрочем, и интерфейсы, нужны для обеспечения нужной сингатуры. Т.е. то, что вы пытаетесь сделать - грязный хак. Об очевидности такого рода кода, я, пожалуй, смолчу...
Ответ написан
Комментировать
@John_Nash
coder
можно не наследоваться или наследника сделать абстрактным
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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