2015-11-26 5 views
6

最初のものが最初です。私のタイトルは誤解を招くものではないことを願っています。私はそれをフレーズするために最善を尽くしたClass1がすでにInterface1を実装している場合は、Class1を継承してInterface1を実装してください。

以下のコードを参照してください。ケース1はかなり単純です。どちらのケースも期待どおりに動作します。私の質問は、コンパイラがケース2を許可するのはなぜですか?これが望ましい場合、特定のシナリオがありますか?私は1つ考えることができません。

interface IEmployee 
{ 
    void Register(string role); 
} 

abstract class Employee : IEmployee 
{ 
    public void Register(string role) 
    { 
     Console.WriteLine(role); 
    } 
} 

// Case 1 
class Manager : Employee 
{ 
} 

// Case 2 
class Developer : Employee, IEmployee 
{ 
} 

class Test 
{ 
    public void Test1() 
    { 
     IEmployee emp1 = new Manager(); 
     emp1.Register("manager"); // output "manager" 

     IEmployee emp2 = new Developer(); 
     emp2.Register("developer"); // output "developer" 
    } 
} 
+0

あなたは従業員から継承している場合には、従業員がIEmployeeから継承するため、あなたのすでにちょうど従業員からの継承や、IEmployeeから継承両方の代わりにIEmployee。それはあなたの質問に答えるか、それがなぜ機能するのか尋ねていますか? – CalebB

+0

@CalebB私はすでにあなたが説明したことを知っています。問題はなぜケース2が許可されているのですか?そのような設計のユースケースはありますか? – niksofteng

+0

IEmployeeは、必要なすべてのIEmployeeメンバーを実装するEmployeeの継承によって実装されるため、これは許可されています。 IEmployeeを明示的に宣言できるので、私が知る限り行う必要はありません。 Employeeの継承を介してDeveloperクラスのメンバーを実装するためのものです。 – CalebB

答えて

3

私は答えはC#の仕様

いくつかのキャッチフレーズで見つけることができ、予想通り編集

13.4.5インターフェイスの実装の継承

明示的インターフェイスを再実装せずに、派生クラスは、どのような方法で、それはインタフェースの実装を継承するクラス

13.4.6インタフェース再実装

その基底クラスから継承するインターフェースのマッピングを変更することはできません


(デジタルコピーは、Visual Studioフォルダで見つけることができます)すべてのケースを研究するために最初の考えをもっと読む

基底クラスのリストに含めて再実装インタフェースに許可されている:ケース2インタフェースは明示的に実装できるので少なくとも許可されます( sample)。 - Developer.Register


から

senior 
i'm developer! 

最初の値がEmployee.Register

第二の値から来ている:それは、利用可能なオプション

public interface IEmployee 
{ 
    void Register(string role); 
} 

public abstract class Employee : IEmployee 
{ 
    public void Register(string role) 
    { 
     Console.WriteLine(role); 
    } 
} 

// Case 2 
public class Developer : Employee, IEmployee 
{ 
    // this will not work without IEmployee in declaration! 
    void IEmployee.Register(string role) 
    { 
     Console.WriteLine("i'm developer!"); 
    } 
} 
public class Program 
{ 
    public static void Main() 
    { 
     var dev = new Developer(); 
     dev.Register("senior"); 

     IEmployee e = dev; 
     e.Register("senior"); 
    } 
} 

プログラム印刷のサブセットであることが判明しました

Developer

// Case 2 
public class Developer : Employee 
{ 
    public void Register(string role) 
    { 
     Console.WriteLine("i'm developer!"); 
    } 
} 

同じプログラムの出力があると定義されている場合:

i'm developer! 
senior 
+0

上記のように従業員を継承するその詩を行うには、IEmployeeを明示的に継承する必要がありますか? – CalebB

+0

はい、 'Employee'と' IEmployee'として使用するときに 'Register'メソッドの結果が異なる場合は、 – ASh

+0

@CalebB、その状況と更新サンプルの詳細を追加しました – ASh