2017-02-17 16 views
1

Детский класс:Как добавить дополнительный код в конструктор дочернего класса при передаче аргументов конструктору родительского класса?

using System; 
using System.Collections; 
namespace Game 
{ 
    public class Warrior:Inhabitant 
    { 
     public Warrior(string name,int age):base(name,age) 
     { 
      private bool mobility; 
      private bool immortality; 
     } 
    } 
} 

Теперь родительский класс:

public class Inhabitant { 

    private string name; 
    private int age; 

    public Inhabitant(string name,int age){ 
     this.name = name; 
     this.age = age; 
    } 

Этот код работает в Java. Я не понимаю, почему он здесь не работает.

+0

Какая ошибка вы получаете? Вы можете защитить свои личные поля, если хотите получить к ним доступ из производного класса. –

+1

Что вы подразумеваете под этим не работает? –

+1

Вам нужно будет определить, что вы подразумеваете под «нерабочим». Этот код должен присваивать имя и возрастные значения. Скомпилирует ли это? Установили ли вы контрольные точки или письменные модульные тесты, чтобы убедиться, что имя и возрастные часы являются тем, что вы ожидаете? Если вы можете, покажите свою ошибку, и мы сможем помочь больше. – tjcertified

ответ

0

Вы не можете использовать модификаторы доступа внутри конструктора. Попробуйте:

public Warrior(string name,int age):base(name,age) 
{ 
    bool mobility; 
    bool immortality; 
} 

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

public class Warrior:Inhabitant 
{ 
     private bool mobility; 
     private bool immortality; 
     public Warrior(string name,int age):base(name,age) 
     { 
      this.mobility=false; //example case 
      this.immortality=true; //example case 
     } 
} 
+0

большое спасибо. Я действительно совершил огромную ошибку. Виноват! Извините –

2

Вы должны объявить приватные поля и инициализировать их в конструкторе

using System; 
using System.Collections; 
namespace Game 
{ 
    public class Warrior:Inhabitant 
    { 
     // declare private fields 
     private bool mobility; 
     private bool immortality; 

     public Warrior(string name,int age, bool mobility, bool immortality):base(name,age) 
     { 
      // initialize 
      this.mobility=mobility; 
      this.immortality=immortality; 
     } 
    } 
} 
+1

Пожалуйста, добавьте объяснение в свой ответ. Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и/или почему оно решает проблему, улучшит долгосрочную ценность ответа. –

+0

Большое спасибо. Это было полезно. –

1
  1. Объявите ваши члены вне конструктор:

    public class Warrior:Inhabitant 
    { 
        private bool mobility; 
        private bool immortality; 
    
        // ... 
    } 
    
  2. Передайте параметры вашему новому конструктору:

    public class Warrior:Inhabitant 
    { 
        private bool mobility; 
        private bool immortality; 
    
        public Warrior(string name,int age, bool mobility, bool immortablity) : base(name,age) // base call as usual 
        { 
         // set properties 
         this.mobility = mobility; 
         this.immortability = immortability; 
        } 
    } 
    
+0

Большое спасибо за полезную информацию –

1

Прежде всего вы не можете объявить любую переменную как частный внутри конструктора или метода класса.

Измените класс Warrior следующим образом, и он должен решить проблему.

public class Warrior:Inhabitant 
{ 
    private bool mobility; 
    private bool immortality; 
    public Warrior(string name,int age):base(name,age) 
    { 

    } 
} 

Если они являются переменными, локальными для конструктора, то они должны быть объявлены без модификаторов доступа.

public class Warrior:Inhabitant 
{ 
    public Warrior(string name,int age):base(name,age) 
    { 
     bool mobility; 
     bool immortality; 
    } 
} 
+0

Большое спасибо –