Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> "Ламерские" вопросы, задаем здесь элементарные вопросы 
:(
    Опции темы
Xao
Дата 9.1.2009, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 24.12.2007

Репутация: нет
Всего: 1



Разбираюсь с наследованием, классами и интерфейсами, есть момент, который не понял

Код:
Код

namespace Interface
{
    interface IShape
    { double CalculateArea();    }

    class Square : IShape
    {
        protected double _width;
        public double Width
        {
            get { return _width; }
            set { _width = value; }
        }
        public double CalculateArea()
        { return _width * _width; }
    }

    class Rectangle : Square, IShape
    {
        double _height;
        public double Height
        {
            get { return _height; }
            set { _height = value; }
        }
        public new double CalculateArea()
        { return Width * _height; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Rectangle rectangle = new Rectangle();
            rectangle.Height = 30;
            rectangle.Width = 20;
            Square square = rectangle;
            IShape shapeCastFromRectangle = rectangle;
            IShape shapeCastFromSquare = square;
            Console.Write(
                "Square area = " + square.CalculateArea() + "\n" +
                "Rectangle area = " + rectangle.CalculateArea() + "\n" +
                "Cast from rectangle area = " + shapeCastFromRectangle.CalculateArea() + "\n" +
                "Cast from square area = " + shapeCastFromSquare.CalculateArea() + "\n" + 
                "");
        }
    }
}


Результат:
Код

Square area = 400
Rectangle area = 600
Cast from rectangle area = 600
Cast from square area = 600


1) Последний результат оказался не тот, который я ожидал(400), ведь в данном случае должен был вызваться метод  CalculateArea() класса square. В чем может быть ошибка?
2) В классе Rectangle в описании метода CalculateArea нужно использовать ключевое слово new. Для чего это делается?
3) Обязательно ли класс Rectangle надо наследовать не только от класса Square, но и от интерфейса IShape?

PM MAIL   Вверх
nmn
Дата 10.1.2009, 02:23 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 593
Регистрация: 26.11.2005

Репутация: нет
Всего: 1



Цитата(Xao @  9.1.2009,  22:59 Найти цитируемый пост)
1) Последний результат оказался не тот, который я ожидал(400), ведь в данном случае должен был вызваться метод  CalculateArea() класса square. В чем может быть ошибка?
2) В классе Rectangle в описании метода CalculateArea нужно использовать ключевое слово new. Для чего это делается?
3) Обязательно ли класс Rectangle надо наследовать не только от класса Square, но и от интерфейса IShape?

1. В square хранится не Square а Rectangle.
2. Самому интересно smile Это похоже на указание о том что свойство переопределяется, но не уверен.
3. Что значит обязательно? Вас никто не заставляет. Хотя если убрать наследование нельзя будет присвоить переменной типа Square переменную типа Rectangle.

PM Skype   Вверх
Xao
Дата 10.1.2009, 04:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 24.12.2007

Репутация: нет
Всего: 1



nmn
1) 
Код

            Rectangle rectangle = new Rectangle();
            rectangle.Height = 30;
            rectangle.Width = 20;
            Square square = rectangle;
            double area = square.CalculateArea();

в этом случае тоже в square хранится Rectangle, однако все правильно работает, я предполагаю, что понижение типа можно использовать только 1 раз, хотя не уверен

2) с или без - результат один и тот же, но выдается предупреждение, если без new

3) можно, когда я убираю наследование от интерфейса IShape, неправильный результат выдает метод CalculateArea(), при понижении типа до IShape, т.е.
Код

            Rectangle rectangle = new Rectangle();
            rectangle.Height = 30;
            rectangle.Width = 20;
            IShape shapeCastFromRectangle = rectangle; //<<<----- будет посчитана площадь квадрата, а не прямоугольника

ну с наследованием вроде понятно, что Rectangle должен наследоваться от тех интерфейсов, до которых будет происходит понижение типа переменных типа Rectangle



PM MAIL   Вверх
Partizan
Дата 10.1.2009, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 8
Всего: 67



Xao, new подавляет предупреждение о том, что невиртуальным метод с той же сигнатурой есть и родителе...вообще вам надо пометить в Rectangle метод CalculateArea ключевым словом virtual, а в его наследнике - пометить словом override


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PashaPash
Дата 10.1.2009, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Xao, в .net немного не так организована работа с интерфейсами. От интерфейса не наследуются, его реализуют. Вот эта строчка:
Код

 IShape shapeCastFromSquare = square;

это не "понижении типа". Это получение ссылки на реализацию интерфейса IShape в объекте, на который ссылается square.
У тебя 2 реализации IShape, при приведении выбирается ближайшая - в классе Rectangle. Правильный подход - оставить одну реализацию, в Square, и сделать функцию CalculateArea виртуальной, а в Rectangle ее переопределить.


--------------------
PM MAIL WWW   Вверх
Xao
Дата 10.1.2009, 18:20 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 24.12.2007

Репутация: нет
Всего: 1



Цитата(PashaPash @  10.1.2009,  14:19 Найти цитируемый пост)
при приведении выбирается ближайшая - в классе Rectangle

ближайшая - это реализация Square?

Цитата(PashaPash @  10.1.2009,  14:19 Найти цитируемый пост)
Правильный подход - оставить одну реализацию, в Square, и сделать функцию CalculateArea виртуальной, а в Rectangle ее переопределить. 

так:
Код

namespace Interface
{

    interface IShape
    { double CalculateArea();    }

    class Square : IShape
    {
        protected double _width;
        public double Width
        {
            get { return _width; }
            set { _width = value; }
        }
        public virtual double CalculateArea() //виртуальный метод
        { return _width * _width; }
    }

    class Rectangle : Square
    {
        double _height;
        public double Height
        {
            get { return _height; }
            set { _height = value; }
        }
        public override double CalculateArea() //переопределение
        { return Width * _height; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Rectangle rectangle = new Rectangle();
            rectangle.Height = 30;
            rectangle.Width = 20;
            Square square = rectangle;
            IShape shapeCastFromRectangle = rectangle;
            IShape shapeCastFromSquare = square;
            Console.Write(
                "Square area = " + square.CalculateArea() + "\n" +
                "Rectangle area = " + rectangle.CalculateArea() + "\n" +
                "Cast from rectangle area = " + shapeCastFromRectangle.CalculateArea() + "\n" +
                "Cast from square area = " + shapeCastFromSquare.CalculateArea() + "\n" + 
                "");
        }
    }

}

если да, то результат неверный:
Код

Square area = 600 //должно быть 400
Rectangle area = 600
Cast from rectangle area = 600
Cast from square area = 600



По поводу приведения типов!

т.е. когда я делаю так:
Код

            Rectangle rectangle = new Rectangle();
            rectangle.Height = 30;
            rectangle.Width = 20;
            Square square = rectangle;
            double area = square.CalculateArea();

то вызывается метод типа Square, т.к. в классе Square он реализован

а когда так:
Код

            Rectangle rectangle = new Rectangle();
            rectangle.Height = 30;
            rectangle.Width = 20;
            Square square = rectangle;
            IShape shapeCastFromSquare = square;
            double area = shapeCastFromSquare.CalculateArea();

то вызывается метод типа Rectangle, т.к. в IShape этот метод не реализован, а только определен, а square это по идее экземпляр Rectangle

выходит, что это такая особенность приведения типов?



PM MAIL   Вверх
Partizan
Дата 10.1.2009, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 8
Всего: 67



удалил

Это сообщение отредактировал(а) Partizan - 10.1.2009, 18:24


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Sovereign
Дата 11.1.2009, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 7.11.2006

Репутация: нет
Всего: 4



как в dataGridView сделать нумерацию строк? smile 
PM MAIL   Вверх
Kolovorot
Дата 12.1.2009, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 12.1.2009

Репутация: нет
Всего: 3



Как сделать подсказку в конструкторе, которая показывает ограничение для вводимых данных. Например http://ipicture.ru/Gallery/Viewfull/11531855.html  В данном случаи показывается ограничение по году, месяцу и дню.

Partizan, благодарю.

Это сообщение отредактировал(а) Kolovorot - 12.1.2009, 18:14
--------------------
Никогда еще истина не повисала на руке безусловного. Фридрих Ницше. Так говорил Заратустра
PM MAIL   Вверх
Partizan
Дата 12.1.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 8
Всего: 67



Kolovorot, это всё берётся из xml-комментариев..

Код

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="value">Value parameter(from 1 to 10)</param>
        /// <param name="x">X parameter (from 0.0 to 1.0)</param>
        public Window1(int value, double x)
        {
            if (value < 1 || value > 10)
                throw new ArgumentException();

            if (x < 0.0 || x > 1.0)
                throw new ArgumentException();
        }


Надо всего лишь написать /// перед объявлением метода/конструктора/... чтобы сгенерировался xml-комментарий


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
EgoBrain
Дата 13.1.2009, 04:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: 1
Всего: 2



1). Как в .NET организовать проверку на существование сторонних (не системных) библиотек.
Например, я создал класс и подключаю его вручную к проекту, а пользователь эту ддлку потерял,
и чтоб приложение перехватывало это исключение а не JIT?

2). Почему CLR .NET выдает исключение на батовский файл? В бате пишу shutdown с параметрами.

Это сообщение отредактировал(а) EgoBrain - 13.1.2009, 05:34
PM MAIL ICQ Skype   Вверх
Xao
Дата 13.1.2009, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 24.12.2007

Репутация: нет
Всего: 1



EgoBrain
ты можешь сделать проверку на наличие файла длл
PM MAIL   Вверх
Unsane
Дата 14.1.2009, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 8.6.2007

Репутация: 2
Всего: 5



Совсем дурацкий вопрос. Как получить имя директории из пути?
Пример: Путь "c:\mydirectory\dir\". Надо получить "dir"..
--------------------
Я дурак.. Этим и интересен!
PM MAIL   Вверх
EgoBrain
Дата 14.1.2009, 05:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: 1
Всего: 2



Цитата(Unsane @ 14.1.2009,  01:51)
Совсем дурацкий вопрос. Как получить имя директории из пути?
Пример: Путь "c:\mydirectory\dir\". Надо получить "dir"..

Класс DerictoryInfo.

Добавлено через 5 минут и 29 секунд
Цитата(Xao @ 13.1.2009,  22:45)
EgoBrain
ты можешь сделать проверку на наличие файла длл

Как проверить, если я подключал бибилиотеку через визуальное проектирование References->AddItem->Browes... ?
PM MAIL ICQ Skype   Вверх
THandle
Дата 14.1.2009, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 1
Всего: 372



Unsane, посмотри System.IO.Path, может там подойдет одна из функций smile


PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1045 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.