2012-06-22 4 views
2

Как перенести этот код (C++) на C#?C++ to C# porting

template <class entity_type> 
class State { 
public: 
    virtual void Enter(entity_type*) = 0; 
    virtual void Execute(entity_type*) = 0; 
    virtual void Exit(entity_type*) = 0; 
    virtual ~State() { } 
}; 
+2

@ lollancf37 То есть то, что голоса для. Повысьте ответы, которые, как вы считаете, хороши, и, скорее всего, искатель взглянет на них. Оставлять комментарии, подобные этому, не помогает. –

+0

Итак, следуя различным вопросам и предположениям, изложенным в ответах ниже, возможно, вы могли бы дать нам несколько советов о том, что такое 'entity_type', и как интерфейс' State' должен работать на нем? Кроме того, здесь указано состояние «State» (например, это чисто абстрактный класс) или содержит конкретные переменные или методы, которые вы не указали? – Rook

+0

Я следую за кодом в книге программирования IA. Хороший текст, но довольно запутанный. Часть кода объясняется после многих страниц. - –

ответ

6

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

interface State<T> 
{ 
    void Enter(T arg); 
    void Execute(T arg); 
    void Exit(T arg); 
}; 

Точного аргумент проходящей конвенция неудобно, хотя. Не зная точно, что вы хотите сделать, сложно сказать, что именно вы должны делать на C#. Возможно, более подходящим может быть void FunctionName(ref T arg).

+1

Возможно, квалифицировать интерфейс с помощью *, где T: class * ? – StuartLC

+1

Возможно, но это накладывает дополнительный уровень ограничения и детализации, отсутствующий в вопросе OP. Пример кода может работать, например, с использованием простого интегрального типа в качестве индекса в какую-либо другую структуру данных. Я попытался сделать минимальные предположения – Rook

3

Некоторые вещи в этом роде:

interface State<T> : IDisposable 
{ 
    void Enter(T t); 
    void Execute(T t); 
    void Exit(T t); 
} 
-1

вы можете написать, как этот

abstract class State<T> : IDisposable where T : EntityType 
{ 
    public abstract void Enter(T t); 
    public abstract void Execute(T t); 
    public abstract void Exit(T t); 

    public abstract void Dispose(); 
} 

исправить T в EntityType класс.

+0

это даже скомпилировать? – Indy9000

+0

@Indeera, попробуйте, если у вас есть сомнения. –

+1

Я сделал, и это не так! – Indy9000

1
public abstract class State<entity_type> 
    { 
     public abstract void Enter(entity_type obj); 
     public abstract void Execute(entity_type obj); 
     public abstract void Exit(entity_type obj); 
    } 

Это похоже на работу: D

+2

Имеет ли 'интерфейс' Решение не работает? Есть причины, по которым самый высокий голосовой ответ использует интерфейс. Возможно, у вас есть дополнительный c которые вы не упомянули? В любом случае, вы можете не публиковать свой собственный ответ, а скорее принять ответ, который вам больше всего помог. –

+0

Правильно, я даю ему попробовать: D –

+0

Конечно, использование интерфейса будет _canonical_ dot-net, что нужно сделать здесь. Помните, что класс может реализовать столько интерфейсов, сколько вам нужно/нужно, но он может наследовать только один базовый класс, абстрактный или другой. – Rook