При создании класса на C# , появилась проблема.Как я понял , virtual с override нужны для разной реализации одного же метода. Так вот , я создал программу
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace nomid
{
class me
{
public int age;
public string name;
public bool grandparents;
public string pet;
public int marks;
public int grands;
public me()
{
age = 0;
name = "None";
grandparents = false;
pet = "None";
marks = 0;
About();
}
public me(int age, string name, bool grandparents, string pet)
{
this.age = age;
this.name = name;
this.grandparents = grandparents;
this.pet = pet;
About();
}
public virtual void About()
{
Console.WriteLine("Name: " + name);
Console.WriteLine("Age: " + age);
Console.WriteLine("GrandParents: " + grandparents);
Console.WriteLine("Pet: " + pet);
if (marks <= 1)
{
marks = 2;
}
if (marks > 12)
{
marks = 12;
}
Console.WriteLine("Middle grands: " + marks);
}
public me(int age, string name, bool grandparents,int grands)
{
this.age = age;
this.name = name;
this.grandparents = grandparents;
this.marks = grands;
About();
}
}
class sister : me
{
public int course;
//private string hi = "А я новый объект класса sister!";
//private string info = "У меня есть аргументы,которые принимаються через класс me";
/*
public sister()
{
About2();
}
*/
public override void About()
{
base.About();
Console.WriteLine("Course: " + course);
}
public sister(int age,string name,bool grandparents,int grands,int course):base(age, name, grandparents , grands) // Наследование спомощью base
{
this.course = course;
About();
}
/*
public void About2()
{
Console.WriteLine(hi);
Console.WriteLine(info);
Console.WriteLine("Также у меня есть свои аргументы,обьекты." );
Console.WriteLine("Course:" + course);
}
*/
}
class MyBigClass
{
static void Main(string[] args)
{
Console.WriteLine("Укажите возраст:");
int x = Convert.ToInt32((Console.ReadLine()));
Console.WriteLine("Укажите имя:");
string x2 = Console.ReadLine();
Console.WriteLine("Укажите вашу середню оценку:");
int x3 = Convert.ToInt32((Console.ReadLine()));
Console.WriteLine("============================================");
me Taras = new me(x,x2, false, x3);
Console.WriteLine("============================================");
//List<me> Dasha = new List<me>();
//Dasha.Add(new sister());
Console.WriteLine("Укажите возраст:");
x = Convert.ToInt16((Console.ReadLine()));
Console.WriteLine("Укажите имя:");
x2 = Console.ReadLine();
Console.WriteLine("Укажите вашу середню оценку:");
x3 = Convert.ToInt16((Console.ReadLine()));
Console.WriteLine("Укажите ваш курс:");
int x4 = Convert.ToInt16((Console.ReadLine()));
sister Dasha = new sister(x, x2, false, x3,x4);
Console.WriteLine("============================================");
Console.ReadKey();
}
}
}
Она имеет класс о информации о мне и сестры , но при этом у сестры ещё добавляется курс(course) , и при вызове About выводится данные которые есть у обоих сторон и ещё выводится course.Но выводится это всё не так как я думал .
Укажите возраст:
10000
Укажите имя:
TozeXz
Укажите вашу середню оценку:
143
Укажите ваш курс:
4
Name: TozeXz
Age: 10000
GrandParents: False
Pet:
Middle grands: 12
Course: 0
Name: TozeXz
Age: 10000
GrandParents: False
Pet:
Middle grands: 12
Course: 4
Почему выводится сначала выводятся все значения нормально кроме course(почему равно 0), а потом все значение выводятся нормально ( все значения соответствуют значениям которые я им передал ) ? Как исправить код так , что бы выводился текст 1 раз , без проблема с информацией которое я ей задал ?
Всё абсолютно верно работает. С созданием класса me
вроде бы все понятно. Он работает так как задумывалось.
Давайте рассмотрим поведение класса sister
. При создание унаследованного класса сначала будет вызван конструктор базового класса .(В конструкторе класса sister
вы даже вызываете конструктор базового класса явно).
Теперь в этом конструкторе базового класса при создании класса sister
вы сначала присваиваете поля базового класса, а потом вызываете метод About()
. Метод About()
виртуальный, значит будет вызвана реализация метода для производного класса (которая выводит еще и курс). Но в момент создания базового класса никакое поле course
ещё не инициализировано (а будет инициализировано позже в конструкторе производного класса). Таким образом в качестве значения выведется значение полученное при создании (0).
А потом будет исполнен конструктор производного класса, который присвоит поле course
и также вызовет метод About()
. Вот и второй вызов этого метода. Но к этому моменту поле course
уже вполне корректно установлено.
Чтобы исправить советую отказаться от практики вызывать в конструкторе всякие побочные методы. И вызывать для каждого класса About()
после его полного создания отдельно.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Изучая паттерн научился более менее связывать элементы окон со свойствами ViewModel, то есть классах, как я понимаю, посредниках между кодом/логикой...
Не получается запустить макрос vba в проекте c#Подскажите, что я делаю не так
Здравствуйте, как в Unity объекту UI Image присвоить спрайт из сети, по определенной ссылке? Или как его можно загрузить в проект и сохранить в нем...