2015-12-31 3 views
1

У меня есть произвольное количество классов, classThatInherits, anotherClassThatInherits и т. Д., Которые наследуют classToBeInherited. У меня тогда есть метод, b, который должен иметь доступ к myValue из классов, наследующих classToBeInherited. Как я могу достичь этого без кастинга?Получить переменную из класса, который наследует другой

//This class will be inherited by other classes 
public class classToBeInherited { 
    public bool isSomething { get; set; } 
} 

//This class with inherit 'classToBeInherited' 
public class classThatInherits : classToBeInherited { 
    public int myValue { get; set; } //this needs to be accessable... 
} 

//...And so will this class 
public class anotherClassThatInherits : classToBeInherited { 
    public int myValue { get; set; } 
} 

private class normalClass { 

    private void a() { 
     classThatInherits cti = new classThatInherits(); 
     b(cti); 

     anotherClassThatInherits acti = new anotherClassThatInherits(); 
     b(acti); 
    } 

    private void b(classToBeInherited c) { 
     //*** 
     //get myValue from the classes that inherit classToBeInherited 
     //*** 
    } 
} 
+1

Из любопытства, есть ли причина, по которой myValue не может быть членом классаToBeInherited? Поскольку функция b() ожидает аргумент типа classToBeInherited, кажется, что myValue должен быть частью этого типа. – chijos

+0

Ну, если классThatInherits может получить к нему доступ, это будет нормально ... – bwoogie

+1

Да. Любой унаследованный класс может обращаться к общедоступным свойствам родительского класса. Поэтому я также думаю, что вам нужно объявить myValue в classToBeInherited. Любое функциональное ограничение не делать этого? Если нет, вам нужно сделать кастинг, чтобы это сделать. –

ответ

3

Move myValue к classToBeInherited :

public class classToBeInherited { 
    public bool isSomething { get; set; } 
    public abstract int myValue { get; set; } 
} 

Затем в classThatInherits и anotherClassThatInherits используйте public override int myValue { get; set; } для реализации этого имущества.

Ofcorse, если myValue требуется только в некоторых классах, тогда у вас есть virtual, а не abstract.

+0

Большое вам спасибо! это то, что мне нужно. – bwoogie

0
var a = c as anotherClassThatInherits; 
if (a != null) 
{ 
    var myValue = a.myValue; 
} 

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


ОБНОВЛЕНО

Если вы действительно не хотите литья, вы можете использовать reflection (но вам все еще нужно знать тип anotherClassThatInherits)

var getter = typeof(anotherClassThatInherits).GetProperty("myValue").GetGetMethod(); 
var myValue = getter.Invoke(c, null); 
+0

Нет, это не будет работать для меня. void b не должен иметь понятия о наследуемых классах. – bwoogie

+0

@bwoogie: Я все равно не думаю, что 'void b не должен иметь понятия о классах, которые наследуют', но если вы хотите избежать кастинга, вы можете использовать отражение. См. Мой обновленный ответ –

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