2013-12-05 2 views
1

Я пытаюсь понять, почему zList ["B"]. Значение не печатает 555.666 в приведенном ниже примере.Наследование классов - несколько типов классов в словаре

Я пытаюсь создать словарь классов, которые могут возвращать разные типы, но я не совсем уверен, как это сделать.

class Program 
    { 
     static void Main(string[] args) 
     { 

      Dictionary<string, BaseClass> zList = new Dictionary<string, BaseClass>(); 
      ClassA zA = new ClassA(); 
      zA.Value = "Test"; 
      zList["A"] = zA; 

      ClassB zB = new ClassB(); 
      zB.Value = 555.666; 
      zList["B"] = zB; 


      Console.WriteLine(zList["A"].Value); 
      Console.WriteLine(zList["B"].Value); 

      Console.ReadLine(); 

     } 
    } 

    public class BaseClass 
    { 
     private string _value; 

     public string Value 
     { 
      get { return _value; } 
      set { _value = value; } 
     } 
    } 

    public class ClassA : BaseClass 
    { 

    } 

    public class ClassB : BaseClass 
    { 
     private new double _value; 

     public new double Value 
     { 
      get { return _value; } 
      set { _value = value; } 
     } 
    } 
+1

Что делает 'zList [" B "]. Вместо этого печать значения? –

+0

Я верю, что значение будет null –

ответ

2

Я пытаюсь понять, почему zList ["B"]. В приведенном ниже примере значение 555.666 не отображается.

Поскольку оператор индекс [] Словаря возвращает BaseClass, единственный вид Value компилятор знает, это один из типов string. Свойство double Value не переопределяет его - оно в дополнение к string одному.

Я пытаюсь создать словарь классов, которые могут возвращать различные

использовать интерфейс вместо базового класса, поставить свойство типа object и положить различные варианты реализации, как это :

interface WithValue { 
    object Value {get;set;} 
} 
public ClassA : WithValue { 
    private string _value; 
    object Value { 
     get {return _value;} 
     set {_value = (string)value;} 
    } 
} 
public ClassB : WithValue { 
    private double _value; 
    object Value { 
     get {return _value;} 
     set {_value = (double)value;} 
    } 
} 

Теперь ваш код от Main должен работать нормально:

Dictionary<string,WithValue> zList = new Dictionary<string,WithValue>(); 
ClassA zA = new ClassA(); 
zA.Value = "Test"; 
zList["A"] = zA; 

ClassB zB = new ClassB(); 
zB.Value = 555.666; 
zList["B"] = zB; 

Console.WriteLine(zList["A"].Value); 
Console.WriteLine(zList["B"].Value); 
4

Вы используете new в вашем определении собственности Value. Вы хотите сделать свой Value по телефону BaseClassvirtual, а затем override по телефону ClassB.

В принципе, то, что происходит в том, что вы скрываете Value свойства базы с вашим собственным и, когда она вызывается на базе, он фактически не имеет значения, потому что он не содержит свойство ClassB._value поля или ClassB.Value ,

EDIT: Я пропустил то, что вы также объявляли о другом типе. Вы не можете переопределить и указать другой тип. Вам нужно придумать другое имя или механизм для возврата определенного типа, если вы хотите вызвать его из базового класса. Возможно, вы захотите изучить Generics, чтобы делать то, что хотите, и вместо этого использовать свойство public T Value {get;set;} в своем базовом классе.

+2

Вы не можете переопределить тип свойства ... – JleruOHeP

+0

@JleruOHeP Упс. Извините, я полностью пропустил свойство, было дано другое.Я уточню свой ответ. – TyCobb

0

Потому что ваш Dictionary имеет тип BaseClass. Таким образом, это означает, что вы ищете Value, который указан в BaseClass.

0

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

static void Main(string[] args) 
    { 

     Dictionary<string, BaseClass> zList = new Dictionary<string, BaseClass>(); 
     ClassA zA = new ClassA(); 
     zA.Value = "Test"; 
     zList["A"] = zA; 

     ClassB zB = new ClassB(); 
     zB.Value = 555.666; 
     zList["B"] = zB; 


     Console.WriteLine(zList["A"].Value); 
     Console.WriteLine(zList["B"].Value); 

     Console.ReadLine(); 

    } 
} 

public class BaseClass 
{ 
    protected string _value; 

    public string Value 
    { 
     get { return _value; } 
     set { _value = value; } 
    } 
} 

public class ClassA : BaseClass 
{ 

} 

public class ClassB : BaseClass 
{ 
    private new double _value1; 

    public new double Value 
    { 
     get { return _value1; } 
     set { _value1 = value; _value = value.ToString(); } 
    } 
} 

Удачи!

Смежные вопросы