Статические абстрактные методы в C # (альтернативы для конкретного случая использования) - PullRequest
1 голос
/ 15 сентября 2010

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

Я работаю над игрой XNA, но проблема нек счастью, задействовать слишком много кода XNA.У меня есть абстрактный базовый класс Note и различные подклассы, полученные из него.В определенный момент я буду рисовать их на экране, поэтому мне придется загружать текстуры (каждый подкласс будет иметь разные текстуры и разное количество текстур), пользователь должен ввести параметр размера, масштабировать текстуры до размера, а затем перебрать мой список и Draw () каждый из них.Эти текстуры довольно большие, и каждый экземпляр данного подкласса будет использовать одни и те же текстуры с одинаковым масштабированным размером, пока пользователь не укажет другой размер, поэтому у меня есть мотивация для статического подхода.

Как я 'мы обнаружили, что абстрактные статические методы недоступны.Мне бы хотелось иметь возможность делать по одному изменению размера текстуры за раз (всякий раз, когда пользователь изменял параметр размера) для каждого подкласса, сохранять масштабированную текстуру как статический объект Texture2D и просто ссылаться каждый раз, когда я буду рисовать экземплярпримечание подтипа.Таким образом, я мог бы избежать использования объекта Texture2D в каждом экземпляре данного класса, производного от Note, а также масштабировать Texture2D в каждом экземпляре.Кроме того, мне бы хотелось иметь возможность эффективно применять «все конкретные подклассы Note должны реализовывать этот статический метод».

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

NoteA.LoadScaledTex(scale);
NoteB.LoadScaledTex(scale);
NoteC.LoadScaledTex(scale);
...
foreach(Note n in notes) {..}

, но я не уверен ни в каком другом элегантном решении.

Ответы [ 2 ]

3 голосов
/ 15 сентября 2010

Статика на самом деле не совсем подходит просто потому, что данный фрагмент данных должен быть общим для всех экземпляров определенного типа. Скорее (и в данном случае особенно) вы должны использовать одноэлементный файл, где все экземпляры внутренне ссылаются на один и тот же единственный экземпляр для хранения общих данных. Таким образом, вы можете легко переопределить реализацию на различных уровнях наследования и даже предоставить вам гибкость, чтобы некоторые производные типы даже не использовали singleton.

public abstract class Note
{
    public abstract void LoadScaledTex(scale);
}

public class NoteA : Note
{
    private static ScaledTexData instance;

    public override void LoadScaledTex(scale)
    {
        lock(this.GetType())
        {
            if(instance == null)
            {
                instance = new ScaledTexData(scale);
            }
        }
    }
}
1 голос
/ 15 сентября 2010

Вам нужно использовать шаблон проектирования AbstractFactory: http://www.dofactory.com/Patterns/PatternAbstract.aspx

Таким образом, у вас есть NoteAFactory, NoteBFactory, NoteCFactory, которые все происходят от NoteFactory, и каждыйможно сделать другое LoadScaledText.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...