2016-11-23 2 views
0

Предположим, у меня есть основания и производный класс, как этотк методам и свойствам наследуемого класса в C#

class Student { 
    public string Name { get; set; } 
    public int RollID { get; set; } 
    public void GetPaint() { } 
} 
class Person : Student { 
    public string Address { get; set; } 
    public void GetGun() { } 
} 
class Content { 
    public void method(Student student) { 
     Student _student = student; 
     Person _person = (Person)student; 

    } 
} 
class Client 
{  
    static void Main() 
    { 
     new Content().method(new Person() { Name="foo",RollID=1}); 
    } 
} 

Сейчас в этом коде при Debug и наведении мышью по параметру метода в содержании Класс, я могу видеть все свойства как Student, так и класса Person

enter image description here но когда я пытаюсь получить доступ к методу, я могу получить доступ только к методу класса Student. Я должен передать его Лицу, чтобы получить доступ к методу класса Person. Мой вопрос в том, как я могу видеть и извлекать значение свойства класса Student, являющегося производным классом класса Person. Почему я могу видеть значение свойства, которое не принадлежит классу Student? и почему я не могу получить доступ к методам. Пожалуйста, объясните, я пропустил некоторые понятия?

+4

Логический мудрый, Студент должен происходить от Лица не наоборот. Ваша логика предполагает, что каждый человек является учеником, и это не так. – NetUser101

+0

Студент не является производным классом, но базовый класс и Person являются производным классом в этом случае. –

+0

@ Класс NetUser101 Лицо будет иметь только сведения о Студенте. Поэтому, когда вы вытаскиваете детали учащегося, вы получите детали только студента, а не его личные данные. –

ответ

1

Почему я могу видеть значение свойства, которое не относится к классу Student?

Поскольку отладчик смотрит на фактической типа (Person в данном случае) объекта и все свойства и т.д., связанных с этим типом.

Почему я не могу получить доступ к методам?

Поскольку переменная имеет тип Student, все, что вы разрешили доступ являются членами Student. Если вы хотите получить доступ к членам другого типа (например, Person), вам необходимо указать , отличное от, чтобы сообщить компилятору «обрабатывать эту ссылку, как если бы она ссылалась на Person». Если Student на самом деле не является Person во время выполнения, вы получите исключение.

+0

хорошо, я знаю причину, по которой мы не можем получить доступ к методам Личности, но мой вопрос заключается в том, когда мы не можем получить доступ к методу Лица, то почему мы можем получить доступ только к свойствам Лица, когда параметр метода int class Context имеет тип Student –

+0

Я запутался - вы можете получить доступ к свойствам 'Person' AND' Student' _ в debugger_.Отладчик может посмотреть на _actual_ тип объекта во время выполнения, который компилятор не может сделать. –

+0

ok, поэтому я могу видеть значения свойства класса Person при отладке. я получил это сейчас –

0

У вас есть наследование. Просто измените свои классы следующим образом:

class Person { 
    public string Address { get; set; } 
    public void GetGun() { } 
} 
class Student : Person { 
    public string Name { get; set; } 
    public int RollID { get; set; } 
    public void GetPaint() { } 
}