2016-07-08 21 views
0

私は混乱していることを知っていますが、この問題の良いタイトルを考えるのは難しいので、ここで詳しく説明します。c#基本クラスと派生クラスがInterfaceメソッドを個別に実装できる方法はありますか?

私は2つの方法、IsValidRow()とのインタフェースAを持っているとIsFileValid() 私は、基本クラスBを持っており、派生クラスC は、ここでの目標は、私がIsFileValid()を実装するための基本クラスをしたいということなので、それがすべてで継承することができますIsValidRow()を実装する基底クラスと各派生クラスから派生したクラス。

問題はIsFileValid()IsValidRow()を呼び出すという問題です。私は

B:A 

をすればAは、現在、私の派生クラスCは、ベースクラスとインターフェイスATMから継承B.

に実装されるIsValidRow()が必要です。

2つのメソッドの要件が満たされている限り、すべてを再構築しても構いません(1つは基本クラスや何かに実装され、継承され、もう1つは派生クラスごとに実装されます)

interface IFileValidator 
{ 
    Pair<bool, string> IsValidRow(List<string> row); 

    bool IsFileValid(string file); 
} 

class FileValidator : IFileValidator 
{ 
    public bool IsFileValid(string file) 
    { 
     // calls IsValidRow() 
     IsValidRow(); 
    } 
} 

class FacilitiesCalendarValidator : FileValidator, IFileValidator 
{ 

    public Pair<bool, string> IsValidRow(List<string> row) 
    { 
      //stuff 
    } 
} 
+1

コーディングハッピー、私はそれは、彼らがインターフェイスから来た場合でも、すべてのメソッドの実装を提供しなければならないとは思いません。 –

答えて

4

どちらの場合でも可能です。

オプションでオーバーライド可能なメソッドの場合は、子クラスに基本クラスメソッドをvirtualoverrideと宣言します。

子クラスによって実装が提供される必要があるメソッドの場合は、クラスとメソッドをabstractとマークします。

子クラスでvirtualメソッドをオーバーライドする必要はないため、明示的にoverrideと決定しない限り、実装は継承されます。

例えば:abstractとして

interface IInterface 
{ 
    int Transform(int a, int b); 
    int AnotherTransform(int a, int b); 
} 

abstract class A : IInterface 
{ 
    public virtual int Transform(int a, int b) 
    { 
     return a + b; 
    } 

    public abstract int AnotherTransform(int a, int b); 
} 

class B : A 
{ 
    public override int Transform(int a, int b) 
    { 
     return a - b; 
    } 

    public override int AnotherTransform(int a, int b) 
    { 
     return a * b; 
    } 
} 
+0

OPもクラス/メソッドを抽象化する必要があるようですが、その情報も追加したいと思うかもしれません。 – Luaan

+0

Bが具体化できないと具体的に言っていないので、彼がしているかどうかはわかりません。 ;)しかし、IsValidRow()は、オプションで実装されるのではなく、子クラスで実装されなければならないと言っているかのように、IsValidRow()を明示する必要があります。 – toadflakz

+0

Mmm。クラスAの場合、Transform()で何かを実装するつもりがなければ、クラスBでのみTransform()を実装しますか?私は基本クラスのバーチャルメソッドでいくつかのガーベッジを返すことができ、派生したものすべてをオーバーライドすることができることを意味します。 – ygongdev

0

あなたは方法IsValidRow()をマークすることができます:私はあなたのためのソリューションを持っている

namespace test 
{ 
    interface A 
    { 
     bool IsFileValue(); 
     bool IsValidRow(); 
    } 

    abstract class B : A 
    { 
     public bool IsFileValue() 
     { 
      return IsValidRow(); 
     } 

     public abstract bool IsValidRow(); 
    } 

    class C : B 
    { 
     public override bool IsValidRow() 
     { 
      return true; 
     } 
    } 
} 
0

インタフェース分掌の原則を使用することです。その意味は2つを宣言することですinterfaces。最初のものはIsFileValid()であり、第2のインターフェースは、第一のインタフェースを実装し、この

Interface A { void IsFileValid(); } 
    Interface B : A { void IsValidRow();} 

と基本クラスはインターフェイスAを実装し、すべての派生クラスがインターフェイスB等を実装するようなIsFileValid()である別の方法を持っている一つの方法を持っていますこの。

public class Base : A 
{ 
     void IsFileValid(){ // immplementaion details} 
} 

public class Child : Base, B 
{ 
     void IsValidRow(){// immplementaion details}  
} 

'B'がabstract` `として宣言されている場合は

+0

基本クラスはそれ自体で 'IsValidRow'を呼び出す必要があるが、子クラスに実装されているので、OPの問題は解決しません。 –

+0

はい、あなたは正しいですが、私は彼が子供クラスからのみIsValidRowを呼び出す必要があると言います。 –

+0

'IsValidRow'は' IsFileValid'から呼び出され、基本クラスは 'IsFileValid'を実装し、子クラスは' IsValidRow'を実装しています。 –