Карта сайта

Это автоматически сохраненная страница от 14.11.2017. Оригинал был здесь: http://2ch.hk/b/res/164925817.html
Сайт 2ch-b.ru не связан с авторами и содержимым страницы
жалоба / abuse: 2ch-b.ru@mail.ru

Пнд 13 Ноя 2017 22:01:46
ООП для даунов-тред очередной C#. Изучаю Наследование
ООП для даунов-тред очередной C#. Изучаю Наследование
ООП для даунов-тред очередной
C#. Изучаю Наследование и полиморфизм.
Возник вопрос. Надеюсь, кто-то более умный подскажет.
Вот есть класс базовый.
class Student
{
// поля класса
private string Name;
private string Surname;
private uint NumClass;

//Свойства класса
public string _Name
{
get { return Name; }
set { Name = value; }
}
public string _Surname
{
get { return Surname; }
set { Surname = value; }
}
public virtual uint _NumClass
{
get { return NumClass; }
set
{
if (value == 0 || _Namer == "" || _Surname == "") { MessageBox.Show("Заполните все поля"); }
NumClass = value;
}
}

Далее, я хочу создать новы класс производный от базового, добавить там поле и перекрыть свойство одного из полей.
class NewStudent:Student
{
private int Age
public _Age{get;set}

//Теперь я пытаюсь переопределить свойство
public override uint _NumClass {get{return NumClass;} set{NumClass = value;}}

Но NumClass не существует. Существует только _NumClass. Почему так? Разве не копируются все поля и свойства базового класса? Тогда почему не скопировалось поле NumClass?



Пнд 13 Ноя 2017 22:03:34
У тебя NumClass приватное в родительском классе. Оно недоступно из наследника.

Пнд 13 Ноя 2017 22:08:13
>>164925944
т.е. оно не копируется в наследнике что ли?

Пнд 13 Ноя 2017 22:09:42
>public override uint _NumClass { get => base._NumClass; set => base._NumClass = value; }
Кстати, вот еще, что значит эта конструкция? Которая сама дописалась.

Пнд 13 Ноя 2017 22:10:31
protected or protected virtual юзай


Пнд 13 Ноя 2017 22:11:10
>>164926426
Нейросеточка порешала.

Пнд 13 Ноя 2017 22:11:46
>>164926301
Нет, ты не можешь к нему обращаться из наследника.

Пнд 13 Ноя 2017 22:12:20
>>164926426
Это геттер и сеттер для поля _NumClass. Синтаксический сахарок от создателей C#. override означает, что потомки класса должны будут эти методы переопределеять.

Пнд 13 Ноя 2017 22:13:09
>>164926641
То есть, не методы, а поле.

Пнд 13 Ноя 2017 22:18:39
>>164926641
Но поля _NumClass не существует же. Етсь только метод с таким именем. А поле называется NumClass.
И что это значит-то? что за знаки =>?

Пнд 13 Ноя 2017 22:22:57
>>164927166
>>Но поля _NumClass не существует же.
Ты ведь сейчас тралишь, верно?

Пнд 13 Ноя 2017 22:23:08
>>164927166
>поля _NumClass не существует же
А на пикче тогда что?

>что за знаки =>?
Ну я же говорю: синтаксический сахар. Вместо get {...} пишешь get => ...


Пнд 13 Ноя 2017 22:24:08
>>164927166
Почитай плез, что такое property, field и method.

Пнд 13 Ноя 2017 22:29:46
>>164927611
поле - это переменная класса
свойство - по сути это метод для доступа к полю
метода - это метод

И я что-то не понял, >>164927522
почему я тралю? Есть поле NumClass и есть его свойство, по сути метод доступа, _NumClass. Разве не так? Самого же поля с таким _NumClass нету же?

Пнд 13 Ноя 2017 22:38:41
[email: sage]

>>164925817 (OP)
> 2017
> изучать ооп

А ты забавный. сажаскрыл

Пнд 13 Ноя 2017 22:39:42
>>164928776
Двачую. В 2017 каждому пора бы уже обзавестись собственным кластером метапарадигм.

Пнд 13 Ноя 2017 23:14:05
,fvg

Пнд 13 Ноя 2017 23:30:23
>Организовать обращения родительских методов к замещающим их методам наследника.
Что это значит? Что-то я не догоняю. Есть мысли?

Втр 14 Ноя 2017 00:23:55
,fvg

Втр 14 Ноя 2017 00:28:54
int index = 0;
dataGridView1.Rows.Add(index, Student.Name, Student.Surname, Student.NumClass, Student.Age;

Вот это вот записывает в 4 столбика датагридвью данные. При том, первый столбик заполняется нулями и потом ниже уже там присваиваются числа по порядку строкам.
А как сделать правильно, чтобы данные записывались в датагридвью со второго столбца, чтобы не перезаписывать данные?

Втр 14 Ноя 2017 00:51:13
1

Втр 14 Ноя 2017 00:53:00
>>164936608
binding list гугли.


Втр 14 Ноя 2017 01:04:27
>>164925817 (OP)
>{
>if (value == 0 || _Namer == "" || _Surname == "") { >MessageBox.Show("Заполните все поля"); }
>NumClass = value;
>}
Пздс.

>>164932630
Очень хуево сформулированное описание полиморфизма.
Типа у тебя есть класс A и его наследник B, с методами f и g. f вызывает this->g(). g переопределен в B

Теперь, если ты вызовешь f() у экземпляра класса B, вызовется метод A.f (т.к. он не переопределен в B), но он уже вызовет B.g


Втр 14 Ноя 2017 01:07:06
>>164928124
>свойство - по сути это метод для доступа к полю
Синтаксический сахар над вызовами методов. Шоб писать obj.prop = obj.prop + 1, а не obj.setProp(obj.getProp() + 1) как в java например. Хотя выполнится по сути одно и тоже

Втр 14 Ноя 2017 01:07:41
>>164937839
>binding list
Ну ладно. А вот еще вопросю
есть базовый класс. там поля и свойства. В свойствах одного из полей есть логика. модификатор этого поля виртуал.
Я хочу при создании класса наследника это свойство перекрыть. Т.е. создаю класс наследник, там одноименное свойство и вместо виртуал пишу оверрайд и, к примеру, стираю логику и делаю свойство по умолчанию.
Т.е. теперь как бы получается что создавая объект класса наследника там не должно быть этой логики, так?

Но она там есть и никуда не делась. Почему так?
Я вот создаю обект наследника через пользовательский конструктор, который в свою очередь обращается к базовому конструктору. Т.е. получается никак я не могу перекрыть свойство, если пользуюсь пользовательским конструктромо?

Втр 14 Ноя 2017 01:13:29
>>164938499
Конструктор-то тут причем? Когда пишешь в свойство экземпляра дочернего класса, что вызывается?

Втр 14 Ноя 2017 01:13:49
>>164938499
В объявлении свойства, которое не хочешь наследовать допиши sealed

Втр 14 Ноя 2017 01:13:53
>>164938358
class A
{
public f()
{g()}
public virtual g()
{}
}

class B
{
public override g()
{}
}

Что-то не понял нихуя. Не мог бы ты показать на каком-нибудь простеньком примере?

Втр 14 Ноя 2017 01:16:17
[email: sage]

Вкатывальщики не нужны

Втр 14 Ноя 2017 01:16:56
>>164938767
class A
{
public f() {
MessageBox.Show("lol"); g();
}
public virtual g() {

}
}

class B: A
{
public override g() {MessageBox.Show("benis!");}
}

obj = new B();
obj.f();

Выдаст lol (из A.f) benis (из B.g)
При этом реализация A ничего про существование B в момент определения не знает.

Втр 14 Ноя 2017 01:21:13
>>164938742
>>164938764
Ну кароч, типа вот так было >>164925817 (OP)
Класс из оп-поста. Там в свойстве_NumClass есть проверка на пустые поля.

Я создаю производный класс. В нем переопределяю как бы свойство НумКласс. Потом в Майн создаю экземпляр этого производного и передаю в него 4 значения аргументами. Ну т.е. через конструктор. И думал, что уже проверки на пустые поля не будет, т.к. переопределили уж то свойство, а оно никуда не делось. Так и должно быть? Ну т.е. если я захочу использовать конструктор и передать сразу 4 аргумента, то никак это не сделать, так чтобы все-таки затереть эту проверку на пустые поля из базового класса?
И выходит так, что

class ExtendedStudent : Student
{
private uint Age;

public uint _Age
{
get { return Age; }
set
{
Age = value;
}
}
public override uint _NumClass { get { return NumClass; } set { NumClass = value; } }

public ExtendedStudent() { }

public ExtendedStudent(string textbox1, string textbox2, uint textbox3, uint textbox4) : base(textbox1, textbox2, textbox3)

{
_Age = textbox4;
}
}

Втр 14 Ноя 2017 01:23:58
>>164938930
а со свойствами этот полиморфизм можно как-то реализовать

Втр 14 Ноя 2017 01:29:34
>>164938930
понятно, ясно, пасибо
А есть идеи как это можно было бы реализовать на свойствах полей класса? Может есть какия-нибудь иедя на этот счет? Просто у меня только поля одни и методов нету, да и вставить некуда.

Втр 14 Ноя 2017 01:40:24
>>164925817 (OP)
Боже, ОП, кто тебя учил так именовать? Naming Conventions прочти, пожалуйста, хотя бы на том же мсдне.

Втр 14 Ноя 2017 01:55:27
>>164938896
Хуй саси, пердун старый, вас нейросеточки скоро заменят.

Втр 14 Ноя 2017 02:26:32
>>164939125
тут поможет кто-ембудь, люди добрые?

Втр 14 Ноя 2017 04:13:39
>>164925817 (OP)
Тому що private методы доступны только внутри
инстанса самого класса.
Protected методы доступны в инстансах самого класса и инстансах его наследников.
Ну и public доступен отовсюду.
Короче тебе нужен protected

Втр 14 Ноя 2017 08:05:10
>>164925817 (OP)
в базовом Student поменяй
private uint NumClass;
на
protected uint NumClass;

Втр 14 Ноя 2017 09:13:22
>>164926301
Копируется конечно, иначе бы у тебя все ооп по пизде пошло. Юзай рефлекшон.


← К списку тредов