2013-03-14 8 views
0

У меня есть немного беспокойство, понимая это.Как обновить дочерний класс при изменении родительского класса?

Моя структура кода выглядит следующим образом:

public class ParentClass 
{ 
    private double p_num; 

    public ParentClass() 
    { 
    } 

    public void AddSomething(double num) 
    { 
     System.Console.WriteLine(ParentNum + num); 
    } 

    public double ParentNum 
    { 
     set { p_num = value; } 
     get { return p_num; } 
    } 
} 

public class ChildClass : ParentClass 
{ 
    private double c_num; 

    public ChildClass() 
    { 

    } 

    public void AddSomething() 
    { 
     base.AddSomething(ChildNum); 
    } 

    public double ChildNum 
    { 
     set { c_num = value; } 
     get { return c_num; } 
    } 
} 

public class Test 
{ 
    public static void Main() 
    { 
     ParentClass p = new ParentClass(); 
     ChildClass c = new ChildClass(); 
     c.ChildNum = 8.0; 
     p.ParentNum = 5.0; 
     c.AddSomething(); 
    } 
} 

Как приходит это печатает 8,0, а не 13,0?

+0

Если вы хотите 13, добавьте следующую строку: «c.ParentNum = 5,0;» выше "c.AddSomething();" –

+0

, потому что 'p' и' c' не совпадают. – Default

ответ

1

Если объявить Parent.p_num как статические, он будет работать:

private static double p_num; 

Но я не уверен, если это ваше намерение , Вы хотите иметь p_num для всех экземпляров класса?

Кстати, у вас в вашем классе много ненужного кода. Это будет делать:

public class ParentClass 
{ 
    public void AddSomething(double num) { 
     System.Console.WriteLine(ParentNum + num); 
    } 

    public double ParentNum { get; set; } 
} 

public class ChildClass : ParentClass 
{ 
    public void AddSomething() { 
     base.AddSomething(ChildNum); 
    } 

    public double ChildNum { get; set; } 
} 

Причины:

  • Нет необходимости указывать конструктор по умолчанию.
  • Используйте авто-свойства вместо поля подложки
+0

Спасибо, Пол. Да, я хочу, чтобы родительская информация делилась между всеми дочерними элементами родителя. Был мозг ... Спасибо за очищение кода, я новичок в C# – ryrich

+0

@ryrich - Вы говорите, что у вас будет только один экземпляр класса Parent? –

3

Поскольку ChildClass наследует от ParentClass не означает, что каждый экземпляр ChildClass наследует свойство экземпляра ParentClass. Это отдельные объекты.

Чтобы представить реальную аналогию, были ли это правдой, если бы мать получила шрам, все ее дети получили бы тот же шрам.

1

p и c - это два разных объекта. Когда вы вызываете c.AddSomething(), значение c.ParentNum является значением по умолчанию 0.0.

2
ParentClass p = new ParentClass(); 
    ChildClass c = new ChildClass(); 
    c.ChildNum = 8.0; 
    p.ParentNum = 5.0; 
    c.AddSomething(); 

p и c не имеет ничего общего здесь! Это всего лишь два отдельных объекта.

Проверьте это, чтобы получить его более ясным:

ChildClass c = new ChildClass(); 
c.ChildNum = 8.0; 
c.ParentNum = 5.0; 
c.AddSomething(); 

Это вернет 13.

0

Потому что вы звоните AddSomething на своем дочернем классе, который является совершенно отдельный экземпляр для ParentClass. ChildClass является подклассом ParentClass, но это не значит, что оба они указывают на то же самое ParentClass. У вас по существу есть два объекта, и вы просто вызываете операцию на 1 из них.

public class Test 
{ 
    public static void Main() 
    { 
     ChildClass c = new ChildClass(); 
     c.ChildNum = 8.0; 
     c.ParentNum = 5.0; 
     c.AddSomething(); 
    } 
} 

Shall даст вам результат вы хотите