2013-03-17 2 views
2

Я проводил некоторые испытания и натолкнулся на что-то странное. Скажем, у меня есть этот интерфейсВозвращает ли ключевое слово `as` все члены класса?

interface IRobot 
    { 
     int Fuel { get; } 
    } 

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

class FighterBot : IRobot 
    { 

     public int Fuel { get; set; } 
    } 

Теперь вы можете прочитать его и установить. Так давайте сделаем несколько тестов:

 FighterBot fighterBot; 
     IRobot robot; 
     IRobot robot2; 
     int Fuel; 
public Form1() 
     { 
      InitializeComponent(); 
      fighterBot = new FighterBot(); 
      robot = new FighterBot(); 
     } 

Сначала я сделал это:

Fuel = fighterBot.Fuel;// Can get it 
      fighterBot.Fuel = 10; //Can set it 

Это следовало ожидать, то я сделал это:

Fuel = robot.Fuel; //Can get it 
      robot.Fuel = 10; //Doesn't work, is read only 

Также следует ожидать. Но когда я это делаю:

robot2 = robot as FighterBot; 
      Fuel = robot2.Fuel; //Can get it 
      robot2.Fuel = 10;//Doesn't work, is read only 

Почему это не работает? Разве это не относится к роботу2 как к FighterBot? Поэтому не следует ли ему устанавливать топливо?

+1

Топливо Иробота действительно только для чтения, это правильно! – David

+0

Это будет работать, если вы скажете «var robot3 = robot как FighterBot;». Компилятор C# использует объявленный тип переменной, чтобы определить, какие функции доступны; присвоение нового значения robot2 не изменяет первоначальный объявленный тип (который по-прежнему остается IRobot). –

ответ

3

Даже если вы бросаете robot к FighterBot через «как» заявление, вы сохраняете результат в переменной типа IRobot так Fuel до сих пор только для чтения.

Вам нужно сохранить результат преобразования в переменной типа FighterBot:

var robot3 = robot as FighterBot; 

Тогда он будет работать.

+0

О, ладно, я понял. Большое спасибо! – CsharpFrustration

1
interface IRobot 
{ 
    int Fuel { get; } 
} 

robot2 = robot as FighterBot; 
Fuel = robot2.Fuel; 

// robot2 is STILL stored as IRobot, so the interface allowed 
// to communicate with this object will be restricted by 
// IRobot, no matter what object you put in (as long as it implements IRobot) 
robot2.Fuel = 10; // evidently, won't compile. 

Некоторые больше контекста:

IRobot r = new FighterBot(); 
// you can only call method // properties that are described in IRobot 

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

FigherBot r = new FighterBot(); 
r.Fuel = 10; 
Смежные вопросы