我认为我在标题中没有很好地解释我的问题,所以我会尽力在这里做。
我有一个名为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#/设计的东西。
另请注意,我的课程更加有条理,只有一个文件包含所有这些。
我正在寻找改进设计的方法。
答案 0 :(得分:1)
这是设计问题,域名设计!
我建议不要编写代码。用笔和纸创建一个类图,不需要在开始时使用工具。
尝试确定实体 - 类,接口等 - 以及之间的关系。只需使用方框和箭头,不需要提供详细信息。使用方框和箭头,您可以更清楚地了解您的域名。在你满意之前,继续精炼和改变,仍然处于这个高水平,没有细节。
然后,一步一步地通过添加详细信息/属性(如属性和方法)来细化它。这可能会导致从第一步更改图表。
我故意没有提到您提到的类和接口等问题的细节。因为,没有足够的信息对此发表评论。其次,更重要的是,你应该从高水平的设计开始,一旦完成,然后根据你的设计进行编码。