User98743 Ответов: 3

Можно ли ссылаться на класс, который был инициализирован вот так...?


Если я инициализирую такой класс, как этот:

Human tom = new Human(new GorillaHead(), new HumanTorso(), new HumanLegs());


Я не могу снова получить доступ к GorillaHead (), верно? Сначала я должен был бы сделать его именованным экземпляром вне сигнатуры человеческого класса, верно?

Что я уже пробовал:

Эта работа:

var gorillahead = new GorillaHead();
var humantorso = new HumanTorso();
var humanlegs = new HumanLegs();
Human tom = new Human(gorillahead, humantorso, humanlegs);

RickZeeland

Это будет работать, но это не совсем то, о чем говорит ООП, постарайтесь сохранить все в человеческом классе, чтобы он был легко доступен ...

3 Ответов

Рейтинг:
27

Mehdi Gholam

Нет, вы не сможете получить к ним доступ за пределами города. Human класс.

Предположительно ваш Human класс должен иметь методы доступа или свойства :

var head = tom.Head; // you will get the GorillaHead 
var torso = tom.Torso; // you will get the HumanTorso
var legs = tom.Legs; // you will get the HumanLegs


[no name]

Отлично. Благодарю вас так много для этого. Конечно, вы можете получить доступ к экземпляру таким образом. лол.

Рейтинг:
2

RickZeeland

Это зависит от того, как выглядит ваш КЛАСС, если вы используете публичные свойства или публичные переменные, например Gorilla, то вы можете ссылаться на свойства. Смотрите пример здесь: [Dotnetperls]
Пример:

public class Human
{
    public string Gorilla { get; set; }
    public string Torso { get; set; }
    public string Legs { get; set; }

    // Constructor
    public Human(string gorilla, string torso, string legs)
    {
       Gorilla = gorilla;
       Torso = torso;
       Legs = legs;
    }
}
Также видеть: Использование Конструкторов (Руководство По Программированию На C#) | Microsoft Docs[^]


[no name]

Вы имеете в виду, что вы могли бы получить доступ к экземпляру Goriallahead() из класса Human через общедоступное свойство, которое заполняет класс Gorillahead (). Я правильно понял?

RickZeeland

Да, смотрите обновленный пример :)

PIEBALDconsult

Хотя, может быть, сделать сеттеров частными.

[no name]

О да. В этом примере я бы полностью оставил сеттеры и принудительно установил свойства в конструкторе. Хорошая точка.

Рейтинг:
0

BillWoodruff

Есть так много способов, которыми вы можете создать/контролировать/ограничить экспозицию Тома ... ошика ... мммм ... части тела в дополнение к упомянутым здесь.

1. есть общественные функции, которые возвращают значение, или значения:

public GorillaHead GetGHead(Human human, Userstatus ustatus)
{
     if(human != null && (ValidateStatus(human, ustatus) > Userstatus.Serf) && human.GorillaHead != null)
    {
         return human.GorillaHead;
    }
    return null;
}
2. Используйте новую семантику кортежа C# 7 для возврата множества различных типов значений:
public (GorillaHead head,Torso torso, Legs legs) GetParts(Human human)
{
   return (human.GorillaHead, human.Torso, human.Legs);
}


[no name]

Святое дерьмо, ты только что подал мне идею. Я искал простую конструкцию для хранения нескольких настроек для каждого поставщика баз данных в той программе, с которой вы помогли мне вчера (что заставляет мое кровяное давление повышаться, просто думая об этом). Я подумывал об использовании анонимных типов для этого, но предполагая, что кортежи поддерживают Tuble<T, T, T>, Я думаю, что попробую это сделать. Спасибо, Билл!