2013-11-19 6 views
0

Есть ли способ вызвать метод overriden из базового класса?Метод переадресации вызова из базового класса

class SpaceObject { 
    public draw() {} 
} 
class Sun : SpaceObject{ 
    public draw() {} 
} 

Sun planet1 = new Sun(); 
SpaceObject planet2 = new SpaceObject(); 
SpaceObject planet3 = new SpaceObject(); 

List<SpaceObject> objs = new List<SpaceObject>(); 
objs.Add(planet1); 
objs.Add(planet2); 
objs.Add(planet3); 

foreach(SpaceObject o in objs) 
    o.draw(); 

Есть ли способ, чтобы в Еогеаспе для planet1 будет звонить на Sun::Draw() вместо SpaceObject::Draw()?

Сейчас у меня есть это так

foreach(SpaceObject o in objs) 
    if(o.GetType() == typeof(Sun) ((Sun)o).draw(); 
    else o.draw(); 

Но я планирую иметь несколько наследств из SpaceObject, так что это не лучший способ пойти.

+1

Виртуальное ключевое слово? Edit: ok, в C++ вы можете использовать ключевое слово virtual перед объявлением вашего метода, чтобы обозначить, что вы должны подниматься так высоко, как можете в иерархии, когда сталкиваетесь с коллекциями полиморфных вещей. Я знаю, что это C#, но, возможно, это то же самое? Попробуйте «виртуальную виртуальную ничью» для каждого из них. –

+1

@ TheMarlboroMan C# также виртуальный только виртуальный .. обязательно. –

+3

@Buksy: 'SpaceObject' будет иметь' virtual public void draw() 'и' Sun' будет иметь 'public override void draw()'. Это элементарный ООП, вы должны прекратить кодирование и сначала прочитать немного, чтобы не застревать каждые 5 минут. – Jon

ответ

5

Сделать SpaceObject.Draw() метод virtual, таким образом, вы можете дать Sun в override Draw() метод. Для получения дополнительной информации вы можете посмотреть на This link on the Microsoft pages, чтобы узнать больше о теме наследования.

3

Меняйте SpaceObject и Sun класс таким образом

class SpaceObject 
    { 
     public virtual void draw() 
     { 
      Console.WriteLine("Log from parent"); 
     } 
    } 

    class Sun : SpaceObject 
    { 
     public override void draw() 
     { 
      Console.WriteLine("Log from Child"); 
     } 
    } 

И вам не нужны if проверку и приведение типов. Просто позвоните

o.draw(); 
Смежные вопросы