2017-03-10 28 views
2

我已經使用了一個接口來提供2個值,即IDName到類EmployeeStudent。此後,我使用了一個類型接口函數來選擇應選擇這兩個類中的哪一個,然後在Main()中提供這些值。現在重點是,我想在Employee類的函數中使用這些值。但不知何故,我沒有得到,如何訪問此函數,因爲類型接口的對象將不允許我訪問對象如果我創建一個新的對象,我提供的值不再存在。那麼做這件事的正確方法是什麼? Plz幫助!我的代碼中接口使用的清晰度

interface IData 
{ 
    int ID { get; set; } 
    string Name { get; set; } 
} 

class Employee : IData 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public void getDetails() 
    { 
     Console.WriteLine("Emp"+ID); 
    } 
} 

class Student : IData 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

class Choice 
{ 
    public IData Fetch(bool Flag) 
    { 
     if (Flag == true) 
     { 
      Employee em = new Employee(); 
      return em; 
     } 
     else 
     { 
      Student st = new Student(); 
      return st; 
     } 
    } 
} 

class Program 
{ 

    static void Main(string[] args) 
    { 
     Choice ch=new Choice(); 
     IData idata = ch.Fetch(true); 
     Console.WriteLine("Enter ID and Name:"); 
     idata.ID = int.Parse(Console.ReadLine()); 
     idata.Name = Console.ReadLine(); 

     //Console.WriteLine("Id={0} & Name={1}", idata.ID, idata.Name); 
     Console.WriteLine(idata.GetType()); 
     Console.ReadLine(); 
    } 
} 
+0

您是否在問如何使用您的'idata'作爲'Employee'對象? –

+0

@Dan我問,如何在從idata對象提供值時訪問員工成員方法 – Im786

回答

0

如果你想用你的IData對象爲Employee對象,你要投它。當然,你應該檢查一下確保演員的角色是否合理。使用這裏的as運營商和測試空都將檢查你的對象實際上是一個Employee並且將它轉換爲,如果是

static void Main(string[] args) 
{ 
    Choice ch=new Choice(); 
    IData idata = ch.Fetch(true); 
    Console.WriteLine("Enter ID and Name:"); 
    idata.ID = int.Parse(Console.ReadLine()); 
    idata.Name = Console.ReadLine(); 

    var employee = idata as Employee; 
    if (employee != null) 
    { 
     employee.getDetails(); 
    } 
    //Console.WriteLine("Id={0} & Name={1}", idata.ID, idata.Name); 
    Console.WriteLine(idata.GetType()); 
    Console.ReadLine(); 
} 

使用您的示例程序,你可以做這樣的事情。你可以做一個直接演員(例如((Employee)idata).getDetails(),但是如果演員失敗了,那麼演員可能會拋出一個異常(並且因爲你犯了一個錯誤或者因爲未來的執行者會以你現在不期望的方式行事) )

+0

非常感謝!想到鑄造,但不知何故,它只是沒有擊中正確的電源線,但是,代碼工作得很好,再次感謝,你能提出解決這個問題的更好方法嗎? – Im786

+0

這是一個非常典型的模式 - 儘管它可能更好地爲你的接口提供更好的名字('IPerson'?'IPersonWithIdentifier'?)。無論如何,很高興hel p - 考慮將此標記爲已接受的答案,並/或提出是否有幫助。 –

+1

當然,我不能高調,因爲我在聲望點上很低,但已被標記爲接受的答案,再次感謝。 – Im786