2014-09-23 3 views
0

Рассмотрите следующий код, который я написал для своего собственного образования. У меня есть основной метод, статический метод и два класса - hold и subshold. Поддержание продолжается.Передано справки, получая значение подкласса

class Program 
{ 
    static void Main(string[] args) 
    { 
     hold h = new hold(); 
     h.aa = 88; 
     Console.WriteLine("In main " + h.aa); 
     thismethod(h); 
     Console.WriteLine("In main2 " + h.aa); 
     Console.WriteLine("In main3 " + h.ss); //ERROR 

     Console.ReadKey(); 
    } 

    static void thismethod (hold h) { 
     Console.WriteLine("In thismdethod " + h.aa); 

     h.aa += 1; 
     Console.WriteLine("In thismdethod1 " + h.aa); 
     h = null; 
     subhold subhold = new subhold(); 

     subhold.aa = 8888; 
     subhold.ss = 22222; 

     h = subhold; 

    } 


} 

class hold 
{ 
    public int aa { get; set; } 

} 

class subhold : hold 
{ 
    public int ss { get; set; } 
} 

Я пытаюсь получить доступ к h.ss. Прямо сейчас у меня нет доступа к нему. Как я могу получить доступ к h.ss из основного метода?

+3

Пара вещей, первый базовый класс не может получить доступ к свойствам/членам дочернего класса. Второе чтение о [Параметр, проходящий в C# от Jon Skeet] (http://www.yoda.arachsys.com/csharp/parameters.html) – Habib

+0

'h' является' hold', а не 'subhold'. У него нет свойства 'ss'. – Blorgbeard

+0

Я также пробовал использовать 'ref', такой как' thismethod (ref h) 'с' static void thidmethod (ref hold h) ' – Zuzlx

ответ

2

Базовый класс не имеет (и, что более важно, не должен) знать что-либо о производном классе
. Различные производные классы могут иметь другой набор добавленных свойств. Создание базового класса знает об этом будет противодействовать важные принципы объектно-ориентированного проектирования

static void Main(string[] args) 
    { 
     subhold h = new subhold(); 
     h.aa = 88; 
     Console.WriteLine("In main " + h.aa); 
     thismethod(h); 
     Console.WriteLine("In main2 " + h.aa); 
     Console.WriteLine("In main3 " + h.ss); //no ERROR 

     Console.ReadKey(); 
    } 
1

Если передать h по ссылке, то thismethod изменится Мэйна h, чтобы указать на экземпляр subhold.

в Main Переменная h еще объявлена ​​ как hold, хотя. Поэтому вам нужно отдать его subhold, чтобы получить доступ к ss.

static void Main(string[] args) 
{ 
    hold h = new hold(); 
    h.aa = 88; 
    Console.WriteLine("In main " + h.aa); 
    thismethod(ref h); 
    Console.WriteLine("In main2 " + h.aa); 
    Console.WriteLine("In main3 " + ((subhold)h).ss); // casted, no error. 

    Console.ReadKey(); 
} 

static void thismethod (ref hold h) {     // passing by reference 
    Console.WriteLine("In thismdethod " + h.aa); 

    h.aa += 1; 
    Console.WriteLine("In thismdethod1 " + h.aa); 
    h = null; 
    subhold subhold = new subhold(); 

    subhold.aa = 8888; 
    subhold.ss = 22222; 

    h = subhold; 
} 
+0

Еще раз спасибо. Хорошая вещь! – Zuzlx