Объекты становятся нулевыми, когда передаются свойству в C # - PullRequest
4 голосов
/ 25 января 2010

У меня есть абстрактный класс Employee и 2 других класса, которые его расширяют (Developer и Manager). Моя проблема заключается в том, что когда я каждый раз, когда я создаю менеджер

Employee man = new Manager(1234567, 30, "Bob", "Pie")

и попробуйте установить его в поле диспетчера нового разработчика,

Employee codemonkey = new Developer(1234568, 20, "Code", "Monkey", (Manager)man)

Я продолжаю получать ArgumentException, что мой менеджер имеет значение null. Я сделал некоторые проверки, и он как-то становится нулевым, когда я пытаюсь установить его с помощью свойства Manager в конструкторе. Любой совет, почему я получаю эту ошибку, будет принята с благодарностью. ТИА!

Код для каждого ниже:

// Класс сотрудника

public abstract class Employee
{
    string firstName, lastName;
    int id, yearsEmployed;

    //Names must be non-empty
    public string FirstName
    {
        get { return firstName; }
        set
        {
            if (!value.Equals(""))
            {
                firstName = value;
            }
            else
                throw new ArgumentException("name cannot be empty");
        }
    }
    public string LastName
    {
        get { return lastName; }
        set
        {
            if (!value.Equals(""))
            {
                lastName = value;
            }
            else
                throw new ArgumentException("name cannot be empty");
        }
    }
    // IDs must be strings consisting of exactly seven digits.
    public int ID
    {
        get { return id; }
        set
        {
            if (value.ToString().Length == 7)
            {
                id = value;
            }
            else
                throw new ArgumentException("ID must consist of 7 digits");
        }
    }
    // Years employed must always be non-negative.
    public int YearsEmployed
    {
        get { return yearsEmployed; }
        set
        {
            if (value >= 0)
            {
                yearsEmployed = value;
            }
            else
                throw new ArgumentException("Year employed must be non-negative");
        }
    }
    //Constructor
    public Employee(int id, int yearsEmployed,
                    string firstName, string lastName)
    {
        this.FirstName = firstName;
        this.LastName = lastName;
        this.ID = id;
        this.YearsEmployed = yearsEmployed;
    }
    public abstract int GetLevel { get; }
    public abstract string GetTitle { get; }
    public string GetFullTitle { get { return GetTitle + " " + GetLevel; } }
}

// Класс разработчика:

 public class Developer : Employee
{
    Manager manager;

    //Manager cannot be null
    public Manager Manager
    {
        get { return manager; }
        set
        {
            if (manager != null)
            {
                manager = value;
            }
            else
                throw new ArgumentException("Manager cannot be null");
        }
    }

    //Constructor
    public Developer(int id, int yearsEmployed, string firstName,
                    string lastName, Manager manager)
        : base(id, yearsEmployed, firstName, lastName)
    {
        Console.WriteLine("manager is not null:" + manager != null); //True here
        this.Manager = manager; // manager is null here
    }

    public override int GetLevel
    {
        get { return (this.YearsEmployed + 1) / 3; }
    }

    public override string GetTitle
    {
        get { return "Developer"; }
    }
}

// Управляющий класс

public class Manager : Employee
{
    //Constructor
    public Manager(int id, int yearsEmployed,
                    string firstName, string lastName)
        : base(id, yearsEmployed, firstName, lastName) { }

    public override int GetLevel
    {
        get { return (YearsEmployed + 1) / 2; }
    }

    public override string GetTitle
    {
        get { return "Manager"; }
    }
}

Ответы [ 4 ]

9 голосов
/ 25 января 2010

Разве вы не хотите сказать:

if (value != null)

вместо

if (manager != null)

Поле менеджера будет инициализировано нулем. Ключевое слово value представляет данные, которые передаются в свойство.

2 голосов
/ 25 января 2010

Изменение

 if (manager != null) 

Для

 if (value != null) 
1 голос
/ 25 января 2010

В настройках Developer.Manager

if (manager != null)

до

if (value != null)
1 голос
/ 25 января 2010

вы никогда не устанавливаете значение диспетчера полей, только свойство Manager, поэтому в свойстве, когда вы проверяете значение manager, оно равно null, поскольку оно не было установлено. Вы можете установить менеджер поля в конструкторе:

this.manager=manager

и проверьте значение в свойстве

if (value!=null)
{
     manager =value;
}

(это необходимо сделать в любом случае, в противном случае значение, которое вы присваиваете свойству, никогда не используется и никогда не будет обновляться)

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

...