Ссылка на функцию класса из элемента связанного списка C # - PullRequest
0 голосов
/ 18 ноября 2018

Для целей моего университетского проекта мне нужно реализовать циклический связанный список, который содержит некоторые конкретные элементы. Проблема: я хочу, чтобы элемент связанного списка имел указатель на функцию из класса, который его создает. Чтобы показать проблему в псевдо-C #:

using System;
class Game{
    internal void state1(){
        Console.WriteLine("Executing state1 code");
    }
    internal void state2(){
        Console.WriteLine("Executing state1 code");
    }
Element elem1 = new Elem(state1);
Element elem2 = new Elem(state2);
elem1.Call();
elem2.Call();
}

class Element{
    FunctionPointer Call = null;
    Element(FunctionPointer function){
        Call = function;
    }
}

Я пытался использовать делегат, но не совсем правильно понял. Можно ли как-то добиться этого с помощью интерфейсов?

Мой представитель попытается:

using System;
public delegate void MyDelegate();

class Game{
    internal void state1(){
        Console.WriteLine("Executing state1 code");
    }
    internal void state2(){
        Console.WriteLine("Executing state1 code");
    }
    Element elem = new Element(new MyDelegate(state1));
}

class Element{
    MyDelegate functionPointer = null;
    Element(MyDelegate func){
        functionPointer =  func;
    }
}

1 Ответ

0 голосов
/ 18 ноября 2018

Есть несколько способов сделать это. Использование делегата было бы что-то вроде ...

public class Game
{
    private Element _element = null;

    public Game()
    {
        _element = new Element(state1);
    }
    internal void state1()
    {
        Console.WriteLine("Executing state1 code");
    }
    internal void state2()
    {
        Console.WriteLine("Executing state2 code");
    }
}

public class Element
{
    public delegate void FunctionPointer();
    private FunctionPointer _function = null;

    public Element(FunctionPointer function)
    {
        _function = new FunctionPointer(function);
        _function();            
    }
}

с использованием интерфейсов ...

public interface IGame
{
    void state1();
    void state2();
}
public class Game : IGame
{
    private Element _element = null;

    public Game()
    {
        _element = new Element(this);
    }
    public void state1()
    {
        Console.WriteLine("Executing state1 code");
    }
    public void state2()
    {
        Console.WriteLine("Executing state1 code");
    }
}

public class Element
{
    private IGame _game = null;

    public Element(IGame game)
    {
        _game = game;
        _game.state1();
    }
}

на мой взгляд интерфейсы лучше

...