Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
tesler
3 / 3 / 3
Регистрация: 08.04.2011
Сообщений: 199
#1

Что делает this - C#

29.07.2013, 13:19. Просмотров 1881. Ответов 35
Метки нет (Все метки)

мог бы кто-нибудь прокоментировать это:

C#
1
2
3
4
5
6
7
8
9
public class Panda
{
 public Panda Mate;
 public void Marry (Panda partner)
 {
   Mate = partner;
   partner.Mate = this;// что в данном случае делает this?
  }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2013, 13:19
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Что делает this (C#):

Что делает оператор => ?
Какую функцию выполнят оператор => в шарпе?

Что делает код?
Добрый день. Требуется помощь по Linq. Может кто-нибудь обьяснить, что делает...

Что делает isReady ?
Что делает !isReady? public partial class Calculator : Window { ...

Что делает приложенный код
Всем привет!) Скажите пожалуйста, что реализует данный код int min = 32000;...

Что делает приведенный код
IsInt = Int64.TryParse(Console.ReadLine(), out intvalue); помогите что эта...

Что делает данная конструкция?
Подскажите пожалуйста что происходит в данной ситуации: ...

35
Евгений В
871 / 640 / 128
Регистрация: 01.03.2010
Сообщений: 1,206
29.07.2013, 23:55 #21
Цитата Сообщение от tesler Посмотреть сообщение
как это по-русски будет звучать то, что написано - "Поле класса типа этого же класса".
Ну, например:
Экземпляр, созданный на основе некоего класса, может содержать поля, для сохранения ссылок на другие экземпляры, тоже созданные на основе этого класса .
1
tesler
3 / 3 / 3
Регистрация: 08.04.2011
Сообщений: 199
30.07.2013, 08:42  [ТС] #22
Евгений В, только для сохранения ссылок? больше никак они не задействуются?
0
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
30.07.2013, 09:21 #23
tesler, в классах только ссылки и задействованы...
1
Евгений В
871 / 640 / 128
Регистрация: 01.03.2010
Сообщений: 1,206
30.07.2013, 10:00 #24
Цитата Сообщение от tesler Посмотреть сообщение
только для сохранения ссылок? больше никак они не задействуются?
Готовые объекты (напоминаю - не класс) хранятся в памяти компьютера в куче а не в стеке. Доступ к ним осуществляется по ссылке. Поэтому, поле Mate типа Panda может хранить ссылку на объект, но обязательно созданный из класса Panda или же null, если на такой объект пока еще не ссылается.

Имея ссылку на объект можно с ним работать работать.
C#
1
public void Marry(Panda partner)
Вы передали объект partner в текущий объект.

C#
1
Mate = partner;
Сохранили ссылку на этот объект в переменную Mate.
Как и переменная int может хранить значение типа int , так и переменная Mate типа Panda может хранить значение типа Panda. А объект partner как раз такого типа.

Имея ссылку на объект, можно с ним работать. Например, "достать" поле этого объекта и присвоить ему значение.
У объекта partner есть поле Mate.
Доступ к нему
C#
1
partner.Mate
Т.к. переменная Mate типа Panda, то в ней можно сохранить ссылку на объект типа Panda.
Т.к. у нас объект текущий, пишем this, сохраняя ссылку в partner.Mate именно на текущий объект
C#
1
partner.Mate = this
Можно было бы и не this а любой объект, типа Panda, если бы он там был.


Цитата Сообщение от Евгений В Посмотреть сообщение
Поэтому, поле Mate типа Panda может хранить ссылку на объект, но обязательно созданный из класса Panda
Хочу уточнить, это сильно упрощенная формулировка. Не всегда это так, но в данном случае, для простоты, считайте что так.
2
tesler
3 / 3 / 3
Регистрация: 08.04.2011
Сообщений: 199
30.07.2013, 10:27  [ТС] #25
Евгений В,
Цитата Сообщение от Евгений В Посмотреть сообщение
Хочу уточнить, это сильно упрощенная формулировка. Не всегда это так, но в данном случае, для простоты, считайте что так.
не хочу считать для простоты, что это так, буду очень благодарен, если дадите пояснения...очень хочется въехать в происходящее...а пояснение выше, очень подробное и понятное, спасибо
0
Евгений В
871 / 640 / 128
Регистрация: 01.03.2010
Сообщений: 1,206
30.07.2013, 12:51 #26
Цитата Сообщение от tesler Посмотреть сообщение
не хочу считать для простоты, что это так, буду очень благодарен, если дадите пояснения...очень хочется въехать в происходящее...
Это уже другая тема, полиморфизм.
Пример
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        class Animal
        {
            public string Name { get; set;}
        }
 
        class Panda : Animal
        {
            public bool clutches = true; // наличие когтей
            
        }
        
        static void Main(string[] args)
        {
            Animal animal; // создаем переменную типа Animal
            Panda panda = new Panda(); // создаем объект типа Panda
            panda.Name="Анфиска";
 
            animal = panda; // кладем в переменную ссылку на объект Panda с именем panda
            Console.WriteLine(animal.Name);
        }
Здесь видно, что переменной типа Animal присваивается ссылка на объект другого типа Panda
C#
1
animal = panda;
Это благодаря тому, что класс Panda наследник базового класса Animal.
Если создать переменную типа базового класса, то через нее можно "смотреть" поля объектов, созданных от класса наследника.

Но нужно понимать, что у наследника могут быть собственные поля, отсутствующие в базовом классе.
Например у объектов класса Panda
C#
1
public bool clutches = true; // наличие когтей
И если так сделать можно
C#
1
2
            animal = panda;
            Console.WriteLine(animal.Name);
то так уже нельзя
C#
1
2
            animal = panda;
            Console.WriteLine(animal.clutches);
Класс Animal "не в курсе" что есть такое поле clutches
1
tesler
3 / 3 / 3
Регистрация: 08.04.2011
Сообщений: 199
30.07.2013, 13:45  [ТС] #27
Евгений В,
Цитата Сообщение от Евгений В Посмотреть сообщение
Это уже другая тема, полиморфизм.
мне кажется это особенности наследования классов, а не полиморфизм...нет?
0
Евгений В
871 / 640 / 128
Регистрация: 01.03.2010
Сообщений: 1,206
30.07.2013, 15:49 #28
Цитата Сообщение от tesler Посмотреть сообщение
мне кажется это особенности наследования классов, а не полиморфизм...нет?
panda.Name="Анфиска"; - это особенность наследования, т.к. у самого класса Panda поле Name нигде не прописано. Оно унаследовалось от базового. Как бы класс Panda "сделал у себя" такое же поле по умолчанию.

При полиформизме, через переменную базового можно обратиться к другим дочерним, или даже внучатым объектам.

animal = panda;

animal может иметь много форм взаимодействия (полиформизм - много форм)

animal = panda;
animal = panda2;
animal = panda3;

class AlbinosPanda:Panda // сделаем внука
...
AlbinosPanda albinosPanda1 = new AlbinosPanda();

animal=albinosPanda1;
animal=albinosPanda2;
и т.д.

Т.е. через animal можно обратиться к полям и методам определенного экземпляра (объекта), у которого породивший этот экземпляр класс является дочкой , внуком, или правнуком от базового класса Animal.
0
body90
366 / 299 / 18
Регистрация: 26.05.2009
Сообщений: 2,676
30.07.2013, 19:09 #29
Попробуйте организовать какой-то список или дерево и поймете для чего это всё нужно. А лучше вообще сделать это на Си, чтоб разобраться.
0
tesler
3 / 3 / 3
Регистрация: 08.04.2011
Сообщений: 199
30.07.2013, 19:21  [ТС] #30
body90, я на Java список реализовывал...но так случилось, что вот эту конструкцию "поле типа класса"...нигде не применял, отсюда запутался с сылками и this-ами
0
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
30.07.2013, 20:13 #31
tesler, и как же вы делали список? можно небольшой отрывок кода класса? Где вы, например, добавляете элемент.
0
tesler
3 / 3 / 3
Регистрация: 08.04.2011
Сообщений: 199
30.07.2013, 20:48  [ТС] #32
Psilon, хорошо, только чуть позже, на другом компе лежит
0
body90
366 / 299 / 18
Регистрация: 26.05.2009
Сообщений: 2,676
31.07.2013, 02:56 #33
Цитата Сообщение от tesler Посмотреть сообщение
"поле типа класса"...нигде не применял
Все поля имеют тип какого-то класса (или структуры, если вдаваться в подробности).
C#
1
2
3
4
5
class MyClass
{
    public string name = ""; // поле типа String
    public Person person = new Person(); //поле типа Person
}
Как String, так и Person - имена классов.
0
tesler
3 / 3 / 3
Регистрация: 08.04.2011
Сообщений: 199
31.07.2013, 08:51  [ТС] #34
body90, да это понятно,но это

C#
1
public Person person = new Person(); //поле типа Person
другой случай немного

Добавлено через 1 час 54 минуты
Psilon, вы правы...видимо я запамятовал...почему то в голове крутилось другое...надо было просто посмотреть и вспомнить

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
public class DopClass {
            int element; 
            DopClass prev;
            DopClass next;
            DopClass head;
            DopClass toll;
    
             DopClass(int element)
                {
                    this.element = element;
                    this.head = this;
                    this.toll = this;
                    this.head.prev = null;
                    this.toll.next = null;
                }
             void formSpisok(int element)
             {
                 
                 DopClass nElement = new DopClass(element);
                 nElement.prev=this.toll;
                 this.toll.next=nElement;
                 this.toll=nElement;
             }
             void Print(int n)
             {
                 DopClass tmp = this.head;
                 for(int i=0;((i<n)&&(tmp!=null));i++)
                 {
                     System.out.print(tmp.element+" ");
                     tmp=tmp.next;
                 }
             }
             void Print()
             {
                 DopClass tmp = this.head;
                 for(int i=0;(tmp!=null);i++)
                 {
                     System.out.print(tmp.element+" ");
                     tmp=tmp.next;
                 }
                
             }
             void Removall()
             {
                 DopClass tmp = this.head;
                 this.head = null;
             }
             void Remove(int index)
             {
                 if (index<this.Size())
                         {
                 DopClass tmp = this.head;
                 for (int i=0;i<index;i++)
                        { 
                            tmp=tmp.next;
                        }
                 if(tmp.next==null)//последний элемент
                    {
                        this.toll=tmp.prev;
                        tmp.prev.next=null;
                    }
                 if (tmp.prev==null)//первый элемент
                    {
                       this.head=tmp.next;
                       tmp.next.prev=null; 
                    }
                 if((tmp.prev!=null) & (tmp.next!=null))//середина 
                  {
                      tmp.prev.next=tmp.next;
                      tmp.next.prev=tmp.prev;
                  }
                         }
             }
0
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
31.07.2013, 09:19 #35
Ну вот и разобрались
0
tesler
3 / 3 / 3
Регистрация: 08.04.2011
Сообщений: 199
31.07.2013, 10:29  [ТС] #36
Спасибо всем кто откликнулся, оказалось я очень сильно протупил

В трёх соснах заблудился
0
31.07.2013, 10:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2013, 10:29
Привет! Вот еще темы с решениями:

Что делает эта строчка?
Доброго времени суток! Читаю справку... Объясните, пожалуйста, что делает эта...

Что делает конструкция c get и set
что делает код public int Index { get; set; } ? Хочу сказать что хорошо...

Что делает этот код?
for (i=0; i&lt;game_get_count(game); i++) { if (user =...

Что делает этот код?
Доброго времени суток уважаемые форумчане. Наткнулся в интернете на код...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru