2010-01-25 2 views
4

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

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

+1 для sking help для разработчиков, называя их кодами обезьян – Marcelo

+0

Веселый. Я этого даже не заметил. Мой мозг проскочил прямо над этим кодом. Кажется, делает мне обезьяну кода. –

+0

Я всегда думал, что кошка обезьяны была несколько приятным термином.Думаю, не все так и будут. Если это кого-то обидело, мои извинения. – Mel

ответ

9

Дон Вы хотите сказать:

if (value != null) 

вместо

if (manager != null) 

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

1

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

this.manager=manager 

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

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

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

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

2

Изменить

if (manager != null) 

Для

if (value != null) 
1

В изменении сеттер Developer.Manager в

if (manager != null) 

в

if (value != null) 
Смежные вопросы