2015-11-29 4 views
2
abstract class Parent 
{ 
     protected string attrParent; 

     public AttrParent { get; protected set } 

     public Parent(string sParent) 
     { 
      AttrParent = sParent; 
     } 
} 

class Child : Parent 
{ 
     private string attrChild; 

     public AttrChild { get; private set } 

     public Child(string sParent, string sChild) : base(sParent) 
     { 
      AttrChild = sChild; 
     } 
} 

class Program 
{ 
     static void Main(string[] args) 
     { 
      Parent p = new Child(); 

      p.AttrChild = "hello"; 
     } 
} 

Когда я запускаю эту программу, я получаю следующее сообщение об ошибке:Наследования: не содержит определение и не метод расширения принимающего первый аргумент

«Example.Parent» не содержит определение для «AttrChild» и без метода расширения «AttrChild» принимать первый аргумент типа "Example.Parent»

Может кто-нибудь объяснить, почему это?

+0

* «Когда я запускаю эту программу» * Что ты имеешь в виду? Он даже компилируется? –

+0

Публиковать 'AttrChild' публично, как это' public AttrChild {get; задавать; } '. И измените переменную 'p' на' Child'. –

+3

Возможно, вы создаете * экземпляр 'Child', но ваша переменная' p' смотрит только на части 'Child', которые уже присутствуют в' Parent' (так как вы определили свой тип 'Parent') .... и нет 'AttrChild' в классе' Parent' –

ответ

2

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

Вы должны были бы обратное приведение его обратно в ChildChild для доступа -только пользователей:

Parent p = new Child(); 

Child c = (Child)p; 
c.AttrChild = "hello"; 

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

0

parent экземпляра может только методы доступа имеющиеся в parent классе, если вы хотите получить доступ к child методов, необходимых для создания child класса. Проблема, если вы пытаетесь получить доступ к методам child из класса parent.

С наследованием, если вы хотите вызвать методы в классе child, вам нужно будет создать новый экземпляр класса child. Цель этого в parent может иметь несколько child классов наследования от него, и если код в вашем примере работал тогда это вызовет проблемы, когда parent имеет несколько child классов.