2016-10-21 2 views
2

본질적으로 일반적인 클래스와 메서드를 만들 때 문제가 발생했습니다.일반 추상 메서드

class GameRoomManager : MonoBehaviour { 
    public GameRoom GetSomething(string s){ 
     //do things here 
     return GameRoomvar; 
    } 
} 

는 지금은 비슷한 무언가를 다른 클래스를 가지고 있지만, 다른 클래스는

class PlayerManager : MonoBehaviour{ 
    public Player GetSomething(string s){ 
     //player related things here 
     return Playervar; 
    } 
} 

내가 GameRoomManager과 PlayerManager는 추상 클래스 복근

class GameRoomManager : Abs{ 
    public override GameRoom GetSomething<GameRoom>(string s){ 
     return GameRoomvar; 
    } 
} 

에서 상속 두 클래스를 갖고 싶어 참여 where

public abstract class Abs{ 
    public T GetSomething<T>(string s); 
} 

솔루션을 찾고있을 때이 주제에 대해 몇 가지 답변을 보았습니다. 모두 추상 클래스 자체가 포괄적이라고 제안했습니다. 내가 본 예제는 내가 할 것이기 때문에 추상적 클래스를 generic으로 만들고 싶지 않다. class GameRoomManager : Abs<GameRoomManager>. 하지만 GameRoomManager가 아닌 GameRoom 유형을 반환하는 방법을 원합니다. 내가 잘못

+0

'그러나 나는 방법을 원하는 XYZ가 아닌 PQR 타입을 반환한다. 그래서'PQR'을 generic으로 만든다. 논의. generic 인자가 타입 자체 일 필요가있는 이유는 무엇입니까? – Servy

+0

예, 이것에 대해 생각해 보았습니다. 그러나이 예제는 T를 반환하는 메서드의 한 유형에 대한 것입니다. 이제 U 유형을 반환하는 다른 메서드가 있으면 어떻게됩니까? 나는'GG '을 만들어야 할 것이다. 그것은 나에게 꽤 어리 석다. 물론 추상적 인 수업을 만들지는 않을 것입니다. 아니면 또 다른 이유가 있습니까, 아니면 더 나은 설명이 왜 당신이 말하는 방식으로해야합니까? – Shraa1

+0

추상 클래스가 필요하지 않은 경우 추상 클래스를 만들지 마십시오. 주어진 메소드가 없다는 것을 감안할 때, 실제로는 추상 클래스가 아니라 인터페이스 여야합니다. 그렇더라도 인터페이스가 필요하지 않다면 인터페이스를 생성하지 마십시오. 필요하다면 사용하십시오. – Servy

답변

0

갈거야 만약 내가 제네릭에 완전히 익숙하지 않다

, 그래서 당신은 일반적인 방법을 사용하는 클래스 PQRHIJ와 공통점이해야 할 올바른 방향으로 날 가리십시오 .

계획 인터페이스를 가진

연결 것.

public interface IPart 
{ 
    // put things here that are common between Part and GameRoom 
    int ID { get; } 
} 
public interface IAbs 
{ 
    IPart GetSomething(string name); 
} 

public class GameRoom : IPart 
{ 
    public int ID { get; set; } 
} 

public class GameRoomManager : IAbs 
{ 
    GameRoom part; 

    #region IAbs Members 

    public GameRoom GetSomething(string name) 
    { 
     return part; 
    } 


    IPart IAbs.GetSomething(string name) 
    { 
     return GetSomething(name); 
    } 

    #endregion 
} 

public class Player : IPart 
{ 
    public int ID { get; set; } 
} 

public class PlayerManager : IAbs 
{ 
    Player part; 


    #region IAbs Members 

    public Player GetSomething(string name) 
    { 
     return part; 
    } 
    IPart IAbs.GetSomething(string name) 
    { 
     return GetSomething(name); 
    } 

    #endregion 
} 

플랜 B

제네릭 형식으로 기본 클래스를 사용 & 인터페이스 여기

public interface IItem 
{ 
    // put things here that are common between Part and GameRoom 
    int ID { get; } 
} 
public class GameRoom : IItem 
{ 
    public int ID { get; set; } 
} 
public class Player : IItem 
{ 
    public int ID { get; set; } 
} 


public interface IAbs 
{ 
    IItem GetItem(string guid); 
} 
public abstract class Abs<T> : IAbs 
    where T : IItem 
{ 
    protected abstract T GetItem(string name); 

    protected Abs(T item) 
    { 
     this.Item=item; 
    } 
    protected T Item { get; private set; } 

    #region IAbs Members 

    IItem IAbs.GetItem(string name) 
    { 
     return GetItem(name); 
    } 

    #endregion 
} 


public class GameRoomManager : Abs<GameRoom> 
{ 
    public GameRoomManager(GameRoom room) : base(room) 
    { 
    } 
    protected override GameRoom GetItem(string guid) 
    { 
     return Item; 
    } 
    public GameRoom GetRoom(string guid) { return GetItem(guid); } 
} 

public class PlayerManager : Abs<Player> 
{ 
    public PlayerManager(Player player) 
     : base(player) 
    { 
    } 
    protected override Player GetItem(string guid) 
    { 
     return Item; 
    } 
    public Player GetPlayer(string guid) { return GetItem(guid); } 
} 

몇 가지 사용 예이다 :

class Program 
{ 
    static void Main(string[] args) 
    { 

     List<IAbs> managers=new List<IAbs>(); 
     var pm=new PlayerManager(new Player() { ID=1001 }); 
     var gm=new GameRoomManager(new GameRoom() { ID=2050 }); 

     managers.Add(pm); 
     managers.Add(gm); 

     IItem part = managers[0].GetItem("0000"); 

    } 
} 
+0

답변을 올렸을 때의 질문 만 업데이트되었습니다. 그것을 더 잘 이해할 수 있도록 클래스 이름을 추가했습니다. – Shraa1

+0

그리고 대답을 업데이트했습니다. 이 접근법이 귀하의 요구 사항을 충족시키지 못하는 것에 대해 의견을 말하십시오. 왜냐하면 당신이 뭘하고 있는지 나에게 불분명하기 때문입니다. – ja72

+0

그래, 더 구체적으로 GetSomething은 GetRoom (string guid)이되어 GameRoom 유형의 객체를 반환하고 플레이어도 GetPlayer (string guid)가되어 플레이어를 반환합니다. – Shraa1