2014-09-01 4 views
0

У меня есть эти два класса:C# реализации абстрактного метода класса: я должен сделать актерский состав?

public abstract class Loop : Events 
{ } 

public class SimpleLoop : Loop 
{ 
    public Sound sound; 
    public SimpleLoop simple; 
} 

И у меня это абстрактный класс с абстрактным методом:

public abstract class AbstractParser 
{ 
    public abstract Loop ParseLoop(); 
} 

И этот другой класс, который расширяет предыдущий класс и реализовать абстрактный метод:

public class Parser2 : AbstractParser 
{ 
    public override Loop ParseLoop() 
    { 
     //not important stuff 
     simpleLoop.simple = (SimpleLoop) ParseLoop(); 
     return simpleLoop; 
    } 
} 

Теперь, мой вопрос: есть ли способ избежать литья внутри simpleLoop.simple = (SimpleLoop) ParseLoop()?

Очевидно, что я не полностью занимался классами, поэтому не спрашивайте себя, какова цель этого беспорядка: D Спасибо за вашу помощь!

+2

Рассматривали ли вы дженерики? –

ответ

5
public class Parser2 : AbstractParser 
{ 
    public override Loop ParseLoop() 
    { 
     return ParseLoopImplementation(); 
    } 

    private SimpleLoop ParseLoopImplementation() 
    { 
     //not important stuff 
     simpleLoop.simple = ParseLoopImplementation(); 
     return simpleLoop; 

    } 
} 

Примечание. Ваш код как это приведет к возникновению исключения StackOverflowException, поскольку он является рекурсивным для всех путей.

+0

Ничего себе, так просто решить, и я не думал об этом, как идиот! Тем не менее, о StackOverflowException ... может быть, в конце концов, потому что '// not important stuff' - ОЧЕНЬ важный материал (и решает такие проблемы, как тот, который вы написали;)). – TwistAndShutter

0

Попробуйте это:

public class SimpleLoopParser<T> : AbstractParser<T> 
{ 
    protected override T ParseLoopImplementation() 
    { 
     simpleLoop.simple = //parse here; 
     return simpleLoop; 
    } 
} 

public abstract class AbstractParser <T> 
{ 
    public override T ParseLoop() 
    { 
     return ParseLoopImplementation(); 
    } 

    protected abstract Loop ParseLoopImplementation(); 
} 

И называть так:

SimpleLoop simpleLoopParsed = new SimpleLoopParser<SimpleLoop>().ParseLoop(); 
Смежные вопросы