如何初始化需要代码其他部分参数的常量数据?

时间:2017-07-07 20:05:20

标签: c#

我认为我在标题中没有很好地解释我的问题,所以我会尽力在这里做。

我有一个名为Song的抽象类,一个扩展它的类MidiSong,然后我有一个SongCreator接口和一个实现它的MidiSongCreator类。我想有办法存储大量的SongCreators所以我可以调用他们的Create方法,但问题是,因为SongCreators每个都是MidiSongCreator我想知道我应该如何初始化每个MidiSongCreator 1}}因为它需要MIDIPlayer和其他东西来帮助初始化它没有静态引用它。我应该创建一个包含许多SongCreators的静态类吗?我不应该使SongList类静态吗?

看起来像是什么:

public abstract class Song{
    public IList<Playable> notes { get; private set; }

    public SongPlayData Start(){
         // calls onStartEvent
       return CreateSongData();
    }
    protected abstract SongPlayData CreateSongData();
    public bool Update(SongPlayData songData, float songTime,List<SongPlayer> players) { // note that the players list is a list of people who are playing this game (this is a rhythm game) (doesn't have anything to do with MIDIPlayer

    }
    public void End(){
       //calls end event
    }
}
public class MidiSong : Song { // this is the class that needs the MIDIPlayer parameter

    public MIDIPlayer midiPlayer;

    protected MidiSong(MIDIPlayer player){
        this.midiPlayer = player;
    }

    protected override SongPlayData CreateSongData() {
        return new MidiSongData(midiPlayer);
    }
}
public interface SongCreator<out T> where T : Song {


    T Create();


}
   public class MidiSongCreator : SongCreator<MidiSong>, IListenerObject { // this is the class that I need to store lots of instances of. the midiPlayer will probably be the same every time

    private MIDIPlayer player;

    public MidiSongCreator(MIDIPlayer player) {
        this.player = player;
        Init();
    }


    private void Init() {
        player.midiListener.listener = this;
        // 
    }
    private void Clear() { // resets all the data so we can create another Song if we need to (even without entering stuff in)
        if(player.midiListener.listener == this) {
            player.midiListener.listener = null;
        }
    }



    public MidiSong Create() {



        MidiSong r = new MidiSong(player);
        // I'm still going to implement calls to other methods from midiPlayer
        Clear();
        return r;
    }

    public void OnLoad(MidiFile file) {
        // does stuff to load midi file (deals with individual events)
    }

}
public class MasterSong : MonoBehaviour { // this should initialize last btw (It's in the Script Execution Order)


    public MIDIPlayer midiPlayer;
    public Song song;
    public SongPlayData playData;

    // Use this for initialization
    void Start() {
        // this is where I'd like to reference a SongCreator and call it's create method and Start the song
        //for instance:
        song = SongList.SONG_NAME.Create();
        playData = song.Start();
    }

    void Update() {

    }
}

这是一个统一的RhythmGame,但我没有添加统一标签,因为我觉得这更像是一个C#/设计的东西。

另请注意,我的课程更加有条理,只有一个文件包含所有这些。

我正在寻找改进设计的方法。

1 个答案:

答案 0 :(得分:1)

这是设计问题,域名设计!

我建议不要编写代码。用笔和纸创建一个类图,不需要在开始时使用工具。

  • 尝试确定实体 - 类,接口等 - 以及之间的关系。只需使用方框和箭头,不需要提供详细信息。使用方框和箭头,您可以更清楚地了解您的域名。在你满意之前,继续精炼和改变,仍然处于这个高水平,没有细节。

  • 然后,一步一步地通过添加详细信息/属性(如属性和方法)来细化它。这可能会导致从第一步更改图表。

我故意没有提到您提到的类和接口等问题的细节。因为,没有足够的信息对此发表评论。其次,更重要的是,你应该从高水平的设计开始,一旦完成,然后根据你的设计进行编码。