2015-08-06 2 views
0

В C++ я был в состоянии сделать этоC# виртуальные методы

class App 
{ 
public: 
    virtual void OnMouseMove(etc); 
    void FunctionThatDoesStuff(); 
}; 

void App::FunctionThatDoesStuff() 
{ 
    // Engine stuff here 
    OnMouseMove(etc); 
} 

class ProjectName : public App 
{ 
public: 
    void OnMouseMove(etc); 
}; 

void ProjectName::OnMouseMove(etc) 
{ 
    // User stuff here 
} 

Затем, когда OnMouseMove был вызван из FunctionThatDoesStuff в App было бы отменяют, и было бы назвать ProjectName.OnMouseMove вместо этого. Но в C# я не мог этого сделать. Это была моя первая попытка.

public class App 
{ 
    protected void MouseMove() 
    { 
     // Engine code here 
     OnMouseMove(etc); 
    } 

    protected virtual void OnMouseMove(etc) 
    { 
     // Do Nothing 
    } 
} 

public class ProjectName : App 
{ 
    protected override void OnMouseMove(etc) 
    { 
     // User code here 
    } 
} 

Я попытался использовать делегатов, поскольку они были просто функциями, которые не реализованы. Однако это не сработало. Как я могу получить эквивалент в C#? Думаю, я мог бы обойти это и использовать события. Но есть ли более похожий способ сделать это.

+1

Вы вызываете 'OnMouseMove' из' App', и он вызывает его на реализацию? Что именно * может обойти это * означает? –

+0

@SriramSakthivel Спасибо. Я сделал редактирование на вопрос. –

+2

Создали ли вы экземпляр 'App' или' ProjectName'. Покажите код, как вы его использовали. –

ответ

0

Если я понимаю, что вы говорите об абстрактных методов и классов:

public abstract class App 
{ 
    protected void MouseMove() 
    { 
     // Engine code here 
    } 

    protected abstract void OnMouseMove(object etc); 
} 

public class ProjectName : App 
{ 
    protected override void OnMouseMove(object etc) 
    { 
     // User code here 
    } 
} 
+1

Это то, что я ищу. Спасибо. –

1

Допустим, у вас есть реализация по умолчанию: MouseMove, в App классе.

public abstract class App 
{ 
    protected void MouseMove() 
    { 
     // Engine code here 
    } 

    protected virtual void OnMouseMove(object etc) 
    { 

    // Default implementation here 
    Console.WriteLine('A'); 

    } 
} 

Тогда у вас есть второй класс ProjectName с другим вариантом осуществления

public class ProjectName : App 
{ 
    protected override void OnMouseMove(etc) 
    { 
     // Overrride implementation 

     Console.WriteLine('B') 
    } 
} 

Затем, когда у вас есть объект типа: App он напечатает И когда у вас есть объект типа: «Projectname» его будет печатать B

var app = new App(); 

    var project = new ProjectName(); 

    app.OnMouseMove(); 
// Will Print A 

    project.OnMouseMove(); 
// Will Print B 
+1

Возможно, вы пропустили редактирование. MouseMove вызывает OnMouseMove, так что код двигателя может быть реализован без возможности видеть его в собственной реализации OnMouseMove. –

+0

Да, в этом случае вам придется использовать абстрактный метод, как указано в принятом ответе. –

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