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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> наследование 
:(
    Опции темы
cthutq
Дата 9.9.2006, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



есть класс

Код

public class Base
{
    Base (String str, int val) {...}
}


хочу наследоваться от него
Код

public class Some : Base
{
    Some (String str, int val) : base (str, val) {...}
}


но что-то не получается создать экземпляр Some. Говорит

Код

error CS0143: The type Some' has no constructors defined


сам класс Some находится в библиотеке. А создаю в приложении
PM MAIL   Вверх
stab
Дата 9.9.2006, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



к определению конструкторов довавь public, например:

Код

public class Base
{
    public Base (String str, int val) {...}
}



--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
cthutq
Дата 9.9.2006, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



cully, спасибо - ни как не могу привыкнуть smile

Добавлено @ 23:43 
З.Ы. Подскажите еще как обстоит дело в C# с виртуальными функциями

Добавлено @ 23:49 
и еще - если каждый метод класса может бросить исключение, то есть ли какие способы кроме try/catch, чтоб в главном классе поймать его и например затенить кнопки
PM MAIL   Вверх
mr.DUDA
Дата 9.9.2006, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

Репутация: 110
Всего: 232



Цитата(cthutq @  9.9.2006,  23:42 Найти цитируемый пост)
З.Ы. Подскажите еще как обстоит дело в C# с виртуальными функциями

Нормально так дело обстоит: ставим перед функцией модификатор virtual - пожалуйста, виртуальная функция; в производных классах ставим не virtual, а override - пожалуйста, перекрытая виртуальная функция... 

З.Ы. в студии 2003/2005 есть офигенно удобная фишка: просто набираем (находясь в классе-наследнике) слово override и пробел - и IntelliSence выведет список доступных виртуальных функций ! А нажав Enter, ещё и сгенерирует тело функции.

Добавлено @ 00:02 
Цитата(cthutq @  9.9.2006,  23:42 Найти цитируемый пост)
и еще - если каждый метод класса может бросить исключение, то есть ли какие способы кроме try/catch, чтоб в главном классе поймать его и например затенить кнопки

Оператор try/catch на то и придуман, чтобы ловить исключения. Если нужно ловить исключение в базовом классе, то пусть метод базового класса "Base.Method" вызывает некий другой метод "virtual Base.DoMethod", который можно будет перекрыть в производном классе. Тогда вызов метода DoMethod можно будет заключить в try/catch в базовом классе и обработать исключение.


--------------------
user posted image
PM MAIL WWW   Вверх
cthutq
Дата 10.9.2006, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(mr.DUDA @  9.9.2006,  23:58 Найти цитируемый пост)
Нормально так дело обстоит: ставим перед функцией модификатор virtual - пожалуйста, виртуальная функция; в производных классах ставим не virtual, а override - пожалуйста, перекрытая виртуальная функция... 

З.Ы. в студии 2003/2005 есть офигенно удобная фишка: просто набираем (находясь в классе-наследнике) слово override и пробел - и IntelliSence выведет список доступных виртуальных функций ! А нажав Enter, ещё и сгенерирует тело функции. 



override я так понимаю это перегруженная
PM MAIL   Вверх
mr.DUDA
Дата 10.9.2006, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

Репутация: 110
Всего: 232



Цитата(cthutq @  10.9.2006,  00:02 Найти цитируемый пост)
override я так понимаю это перегруженная

нет, перекрытая
перегруженная - это overloaded, т.е. с отличающейся сигнатурой (другой набор аргументов)


--------------------
user posted image
PM MAIL WWW   Вверх
stab
Дата 10.9.2006, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Как модератор скажу: один топик - один вопрос. Впредь попрошу придерживаться этого правила.

Но на вопросы отвечу.  smile

1. Чтобы сделать метод виртуальным его надо пометить ключевым словом virtual. Чтобы его перекрыть в потомке надо использовать ключевое слово override. MSDN тебе в помощь.

2. Это уже от тебя как от программиста зависит как ты реализуешь обработку исключений. Можно каждое обращение к объекту завернуть в try-catch, что есть лучший вариант. Можно в классе сделать событие, скажем, ExceptionThrown на него повесить обработчик затенения. Можно использовать событие Application.ThreadException или AppDomain.UnhandledException, в обработчике выполнять проверки и затенять кнопки. Вторые два способа упрощают работу, но плохи с точки зрения дизайна кода.

Добавлено @ 00:06 
mr.DUDA, опередил, блин.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
mr.DUDA
Дата 10.9.2006, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

Репутация: 110
Всего: 232




Модератор: Сообщение скрыто.



--------------------
user posted image
PM MAIL WWW   Вверх
cthutq
Дата 10.9.2006, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(mr.DUDA @  10.9.2006,  00:03 Найти цитируемый пост)
нет, перекрытая
перегруженная - это overloaded, т.е. с отличающейся сигнатурой (другой набор аргументов) 

понял - спасибо


Цитата(cully @  10.9.2006,  00:05 Найти цитируемый пост)
Как модератор скажу: один топик - один вопрос. Впредь попрошу придерживаться этого правила.

ну тема про наследование, поэтому...


Цитата(cully @  10.9.2006,  00:05 Найти цитируемый пост)
Можно каждое обращение к объекту завернуть в try-catch, что есть лучший вариант

не очень удобно из catch дергать один и тотже метод


Цитата(cully @  10.9.2006,  00:05 Найти цитируемый пост)
Можно в классе сделать событие, скажем, ExceptionThrown на него повесить обработчик затенения. Можно использовать событие Application.ThreadException или AppDomain.UnhandledException, в обработчике выполнять проверки и затенять кнопки. Вторые два способа упрощают работу, но плохи с точки зрения дизайна кода.

можно тут поподробнее. Я могу конечно залесть в камасутру (MSDN), но с С++ тядело так сразу smile
PM MAIL   Вверх
mr.DUDA
Дата 10.9.2006, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

Репутация: 110
Всего: 232



Цитата(cthutq @  10.9.2006,  00:13 Найти цитируемый пост)
можно тут поподробнее. Я могу конечно залесть в камасутру (MSDN), но с С++ тядело так сразу

То, о чём говорит уважаемый мной cully, не есть синтаксический сахар C#, а лишь одна из возможностей, предоставляемых .NET Framework - любое необработанное исключение можно "обработать", подписавшись на одно из указанных событий... Единственный минус: исключение так и останется необработанным, а мы лишь можем оставить след в лог-файле или вывести MessageBox с извинением об ошибке.

З.Ы, это к тому, что от грамотного проектирования последовательности вызовов и структурированной обработки исключений никто нас не избавляет.
Добавлено @ 00:20 
Цитата(cthutq @  10.9.2006,  00:13 Найти цитируемый пост)
ну тема про наследование, поэтому...

вообще-то, в самом деле, одна тема - один вопрос smile


--------------------
user posted image
PM MAIL WWW   Вверх
cthutq
Дата 10.9.2006, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(mr.DUDA @  10.9.2006,  00:19 Найти цитируемый пост)
З.Ы, это к тому, что от грамотного проектирования последовательности вызовов и структурированной обработки исключений никто нас не избавляет.

просто мне приходится создавать класс, который можит бросить исключение. А помимо этого я создаю однотипный класс, который имеет теже функции, но с try/catch. И в каждом catch я дергаю метод. Сделать это в самом классе не могу, потому, что не знаю что нужно в catch (это знает только использующий класс). А вот если можно как вы говорите зарегистрироваться на это исключение и только в одном месте вызывать функцию - то это должно быть ужобно. Только не понятно почему оно не будет обработано ?
PM MAIL   Вверх
stab
Дата 10.9.2006, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Класс с исключениями:

Код

using System;
using System.Collections.Generic;
using System.Text;

namespace Exceptions
{
    public delegate void ExceptionThrownEventHandler(MyClass sender, Exception ex);

    public class MyClass
    {
        public void MethodWithExceptions()
        {
            try
            {
                int i = 0;
                i /= i;
            }
            catch(Exception ex)
            {
                OnExceptionThrown(ex);
            }
        }

        public event ExceptionThrownEventHandler ExceptionThrown;

        protected void OnExceptionThrown(Exception ex)
        {
            if (ExceptionThrown != null)
            {
                ExceptionThrown(this, ex);
            }
        }
    }
}


Его использование:

Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Exceptions
{
    public partial class Form1: Form
    {
        private MyClass myObject = new MyClass();

        public Form1()
        {
            InitializeComponent();
            myObject.ExceptionThrown += myObject_ExceptionThrown;
        }

        private void myObject_ExceptionThrown(MyClass sender, Exception ex)
        {
            // if (exception is bad exception)
            // {
            button1.Enabled = false;
            // }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            myObject.MethodWithExceptions();
        }
    }
}


Поверь, это чОрная магия, это неправильно.  smile 


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
cthutq
Дата 10.9.2006, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(cully @  10.9.2006,  00:28 Найти цитируемый пост)
Поверь, это чОрная магия, это неправильно.

раз уж зашел разговор про виртуальные методы - то можно ли тогда excption на него возложить ?

З.Ы. Только еще вопрос - есть ли в C# чисто виртуальные методы.

1. Если нет, то нужно класс объявить как abstract ?
2. Если да, то нужно ли перекрывать все виртуальные методы. Или можно только... как сказать не знаю (В С++ это чисто виртуальные)... только чисто виртуальные ?
PM MAIL   Вверх
nikitao
Дата 10.9.2006, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


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

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



cthutq, абстрктные ( С# )== Чисто внатуре виртуальные( С++). Любой класс\структура содержащие абстрактные методы должен сам быть обьявлен абстрактным. 

ЗЫ Я уже предвижу след. вопрос про Интерфейсы smile 

Это сообщение отредактировал(а) nikitao - 10.9.2006, 00:51


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
stab
Дата 10.9.2006, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Чисто виртуальные методы есть, называют их абстрактными, и объявляться они могут только в абстрактынх классах:

Код

public abstract class AbstractClass
{
    public abstract void AbstractMethod();
}


1. Да.

2. Все не надо, надо только абстрактные.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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