2015-04-17 3 views
1

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

public interface IGameObject 
{ 
    Vector3 GetSomePosition(); 
} 

public interface IPlayer : IGameObject 
{ 
    void Die(); 
} 

public class Player : GameObject, IPlayer 
{ 
    void Die() { } 
} 

Могу ли я реализовать интерфейс IGameObject в каком-нибудь другом классе вместо класса игрока и использовать реализацию этого другого класса? Например, некоторый специальный класс, называемый «GameObjectImplementation», который реализует интерфейс IGameObject. Так как я не могу наследовать от двух классов, как мне это сделать?

----------------------------- РЕДАКТИРОВАТЬ ---------------- -----------

Лучшим решением, которое я нашел сейчас, было создание базового класса.

public abstract class PlayerBase : GameObject, IGameObject 
{ 
    public Vector3 GetSomePosition() 
    { 
     return this.transform.Position; 
    } 
} 

public class Player : PlayerBase, IPlayer 
{ 
    void Die() { } 
} 

Любые другие предложения? Как инъекция или каким-то образом явных реализаций? Или это лучший способ сделать это уже?

+0

Если GameObject реализует IGameObject, тогда вам не нужно предоставлять дополнительную реализацию в Player – Ewan

+0

Вы можете реализовать несколько интерфейсов в каком-то базовом классе и расширить его. На вашем коде вы внедрили класс GameObject, я думаю – Orifjon

+0

Класс GameObject исходит из библиотеки и не имеет интерфейса для его методов, вот почему мне нужно отвлечь его методы, чтобы я мог получить доступ к нему из других мест , Попробует решение с абстрактным классом и дополнительным наследованием. – PsMaster

ответ

3

Если вы имеете в виду что-то вдоль этих линий:

public class GameObjectImplementation: IGameObject 
{ 
    public Vector3 GetSomePosition(){ 
     return null; 
    } 
} 

public class Player : GameObjectImplementation, IPlayer 
{ 
    public void Die() { } 
} 

то да, вы можете. Класс Player наследует только от GameObjectImplementation и реализует IPlayer (непосредственно) и IGameObject через базовый класс.

Также обратите внимание, что методы реализации должны быть доступны извне класса (например, public), потому что inteface определяет контракт, и только внешне доступные вещи способны выполнить это.

+0

Невозможно сделать это, поскольку Player необходимо унаследовать от GameObject (это из библиотеки). – PsMaster

Смежные вопросы