簡體   English   中英

具有unity和C#的類和接口

[英]Classes and interfaces with unity and C#

我需要一點幫助。 我有一個類名“ Employee”,並且已經繼承了兩個基類,即“ Manager”和“ Clerk”,現在我需要另一個繼承“ Manager”和“ Clerk”的類,但是多重繼承是在C#或Unity / C#中不可能。 但是有人建議我使用“接口”。 我對“接口”有點陌生。 所以有人可以幫我嗎? 請發送示例代碼。

考慮一下:

public abstract class ManagerBase
{
    public void Execute()
    {
        Manage();
    }

    public virtual void Manage() {}
}

public abstract class ClerkBase
{
    public virtual void Expedite(){}

    public void Execute()
    {
        Expedite();
    }
}

public class ManagingClerk : ClerkBase, ManagerBase
{
    public override void Expedite()
    {
        Console.WriteLine("Expedited");
    }

    public override Manage()
    {
        Console.WriteLine("Managed");
    }
}

在這里,您嘗試繼承幾個基類,問題是編譯器無法知道派生繼承的哪個版本的“ Execute”。 這被稱為“死亡鑽石”

相反,您可以做的是不提供實現並將基類標記為接口:

public interface IManager
{
    void Execute();

    void Manage();
}

public interface IClerk
{
    void Expedite();

    void Execute();
}

public class ManagingClerk : IClerk, IManager
{
    public void Expedite()
    {
        Console.WriteLine("Expedited");
    }

    void IClerk.Execute()
    {
        Expedite();
    }

    public void Manage()
    {
        Console.WriteLine("Managed");
    }
    void IManager.Execute()
    {
        Manage();
    }
}

在這里,編譯器將知道哪些方法屬於什么方法。 您從基類中釋放了繼承的實現,但是獲得了多個繼承。

您可以使用聚合:

public interface IEmployee
{
}

public interface IClerk : IEmployee
{
  void DoClerkThing();
}

public interface IManager : IEmployee
{
   void DoManagerThing();
}

public class Clerk : IClerk
{
  public void DoClerkThing()
  {
  }
}

public class Manager : IManager
{
   public void DoManagerThing()
   {
   }
}

public class ManagerAndClerk : IManager, IClerk
{
  private readonly Manager manager;
  private readonly Clerk clerk;

  public ManagerAndClerk(Manager manager, Clerk clerk)
  {
    this.manager = manager;
    this.clerk = clerk;
  }

  public void DoClerkThing()
  {
    this.clerk.DoClerkThing();
  }

  public void DoManagerThing()
  {
    this.manager.DoManagerThing();
  }
}

在Unity中,您可以將多個組件附加到一個游戲對象上,對於大多數組件類型而言,該對象可以是同一類型。 這意味着您可以將兩個腳本附加到單個游戲對象。

這和繼承有很大的不同,但是在很多情況下很有用,但是使用接口可能是一個更好的主意。

您擁有Employee類,及其派生類Clerk和Manager作為腳本組件。 然后,將ManagingClerk作為另一個腳本:

[RequireComponent(typeof(Manager), typeof(Clerk))]
public class ManagingClerk : Employee {
}

現在,當您將此腳本附加到游戲對象時,它將自動附加Manager和Clerk,並且您將無法刪除它們。

您可以使用GetComponent來訪問特定的方法和成員:

Manager manager;
Clerk clerk;
void Awake(){
    //find components
    manager = GetComponent<Manager>();
    clerk = GetComponent<Clerk>();
    //initialize both
    manager.Init(this);
    clerk.Init(this);
}
public void DoManagerStuff() { manager.DoStuff(); }
public void DoClerkStuff() { clerk.DoStuff(); }

這種方法的缺點是,您將三個員工附加到一個游戲對象上,其中兩個不是真實對象。 在更換經理和文員時,您需要格外小心,不要弄亂managementClerk。

為了初始化附加到managementClerk的職員和經理組件,您需要在經理和職員中實現一個方法(Init)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM