Сценарий, в котором статические виртуальные методы имеют смысл - PullRequest
0 голосов
/ 14 сентября 2010

Я знаю, что методы virtual и static являются противоположными понятиями, но я думаю, что иногда имеет смысл использовать их вместе. По этой теме было довольно много похожих вопросов по SO, но следующий сценарий еще не был рассмотрен.

Есть интерфейс C #, который выглядит так:

interface IVertexMeshLoader
{
    VertexMesh LoadFromFile(string fname);
}

Реализация этого может выглядеть следующим образом:

class VertexMeshLoaderObj : IVertexMeshLoader
{
    public VertexMesh LoadFromFile(string fname) { .. }
}

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

Лучшее решение, которое я до сих пор разрабатывал, - это написать статический метод LoadFromFileStatic(), который содержит реальный код. LoadFromFile() тогда просто называет это. Не очень красиво, имхо.

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

Есть ли лучшие способы? Спасибо: -)

Ответы [ 3 ]

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

Вот еще один вариант.Предоставьте явную реализацию интерфейса, который просто вызывает статический метод.Это позволяет им иметь одинаковое имя

class VertexMeshLoaderObj : IVertexMeshLoader
{
  VertexMesh IVertexMeshLoader.LoadFromFile(string fname) { 
    LoadFromFile(fname);
  }
  public static VertexMesh LoadFromFile(fname) {
    ...
  }
}
0 голосов
/ 14 сентября 2010

Даже если вас интересует только vtable объекта, а не фактические члены, вам нужен экземпляр объекта, чтобы знать, какой метод вызывать.

Таким образом, даже если фактическая реализация, кажется, не зависит от экземпляра, на самом деле это так.

Вы используете не «статические виртуальные» методы, а действительно виртуальные .

0 голосов
/ 14 сентября 2010

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

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