2014-02-03 4 views
1

Я пытаюсь создать базовый класс, который будет использоваться для хранения данных с ключом/значением. Базовый класс будет генерировать ключи и отвечает за хранение данных. Когда базовый класс наследуется, производный класс может указать свой собственный ключ, но базовый класс должен знать ключ производных классов. Например:Как узнать базовый класс о свойствах производного класса?

public class ParentClass 
{ 
    private string key = "Parent"; 

    public void GenerateKey() 
    { 
     Console.WriteLine(key); 
    } 
} 

public class FeatureClass : ParentClass 
{ 
    public string key = "Feature"; 

} 

public class SubFeatureClass : FeatureClass 
{ 
    public string key = "SubFeature"; 

} 

FeatureClass feature = new FeatureClass(); 
feature.GenerateKey(); //I would like this to produce "Parent_Feature" 

SubFeatureClass subFeature = new SubFeatureClass(); 
subFeatureClass.GenerateKey(); //I would like this to generate "Parent_Feature_SubFeature" 

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

+0

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

ответ

4

вы можете сделать это, сделав основной метод virtual и ссылки на него в переопределении:

public class ParentClass 
{ 
    public virtual string key {get {return "Parent";}} 

    public void GenerateKey() 
    { 
     Console.WriteLine(key); 
    } 
} 

public class FeatureClass : ParentClass 
{ 
    public override string key {get{return base.key + "_Feature";}} 

} 

public class SubFeatureClass : FeatureClass 
{ 
    public override string key {get{return base.key + "_SubFeature";}} 

} 
0

абстрактных или виртуальные функции могут быть использованы для достижения этой цели (что одна зависит от имеет ли смысл для ParentClass быть фактическим типом или всегда нуждается ли производный класс.

В любом случае, вы бы виртуальная (или абстрактная) функция, которые вы переопределить в производном классе возвращает специальный ключ в самом деле, в C# вы можете иметь виртуальные/абстрактные свойства:.

public abstract class ParentClass 
{ 
    private string key = "Parent"; 

    protected abstract string derivedKey 
    { 
     get; 
    } 

    public void GenerateKey() 
    { 
     Console.WriteLine(key + derivedKey); 
    } 
} 

public class FeatureClass : ParentClass 
{ 
    public override string derivedKey 
    { 
     get 
     { 
      return "Feature"; 
     } 
    } 

} 
+0

Вы затеняете свойство, а не переопределяете его, так что это не сработает. – Servy

+0

Ooops, знал, что я должен был попробовать его с помощью компилятора, исправит –

0

Вы можете сделать это, используя virtual свойства,

public class ParentClass 
{ 
    public virtual string Key 
    { 
     get 
     { 
      return "Parent"; 
     } 
    } 
} 

public class FeatureClass : ParentClass 
{ 
    public override string Key 
    { 
     get 
     { 
      return base.Key + "_" + "Feature"; 
     } 
    } 

} 

public class SubFeatureClass : FeatureClass 
{ 
    public override string Key 
    { 
     get 
     { 
      return base.Key + "_" + "SubFeature"; 
     } 
    } 
} 

Тогда, вы можете использовать его таким образом,

FeatureClass feature = new FeatureClass(); 
Console.WriteLine(feature.Key); // <-- "Parent_Feature" 

SubFeatureClass subFeature = new SubFeatureClass(); 
Console.WriteLine(subFeature.Key); // <-- "Parent_Feature_SubFeature" 
0

Использование виртуальной собственности вместо поля:

public class ParentClass 
{ 
    public ParentClass(){Key = "Parent";} 
    private virtual string Key {get;set;} 

    public void GenerateKey() 
    { 
     Console.WriteLine(Key); 
    } 
} 

public class FeatureClass : ParentClass 
{ 
    public FeatureClass(){Key = base.Key + "_" + "Feature";} 
    override string Key {get;set;} 
} 
0
public class ParentClass 
{ 
    protected List<string> keys = new List<string>(); 

    public ParentClass() 
    { 
     keys.Add("Parent"); 
    } 

    public void GenerateKey() 
    { 
     Console.WriteLine(string.Join("_", keys)); 
    } 
} 

public class FeatureClass : ParentClass 
{ 
    public FeatureClass() 
    { 
     keys.Add("Feature"); 
    } 
} 

public class SubFeatureClass : FeatureClass 
{ 
    public SubFeatureClass() 
    { 
     keys.Add("SubFeature"); 
    } 

} 
+0

. Полученные типы не будут иметь доступа к «клавишам» здесь. – Servy

+0

извините! Он будет публичным :) – halit

+1

Он должен быть «защищен». Быть общедоступным означает, что он может быть запутан другими типами, чего не должно быть. – Servy

0

Использование конструктора перегружать и конструктор цепочки в моей версии:

public class ParentClass 
{ 
    private string key; 

    protected ParentClass(string childKeys) 
    { 
     key = !string.IsNullOrEmpty(childKeys) ? key + "Parent_" + childKeys : key; 
    } 

    public void GenerateKey() 
    { 
     // Get keys from subclasses 
     Console.WriteLine(key); 

    } 
} 

public class FeatureClass : ParentClass 
{ 
    public FeatureClass() : base("Feature") { } 
    protected FeatureClass(string key) : base("Feature_" + key) { } 
} 

public class SubFeatureClass : FeatureClass 
{ 
    public SubFeatureClass() : base("SubFeature") { } 
    protected SubFeatureClass(string key) : base("SubFeature_" + key) { } 
} 

public class ReallySubFeatureClass : SubFeatureClass 
{ 
    public ReallySubFeatureClass() : base("ReallySubFeature") { } 
} 

код Test выглядит так же, как ваш, но я добавил еще один уровень, например:

class Program 
{ 
    static void Main(string[] args) 
    { 
     FeatureClass feature = new FeatureClass(); 
     feature.GenerateKey(); //I would like this to produce "Parent_Feature" 

     SubFeatureClass subFeature = new SubFeatureClass(); 
     subFeature.GenerateKey(); //I would like this to generate "Parent_Feature_SubFeature" 

     ReallySubFeatureClass reallySubFeature = new ReallySubFeatureClass(); 
     reallySubFeature.GenerateKey(); 

     Console.ReadKey(); 
    } 
} 

Результат:

enter image description here

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