4

私はインターフェースの使い方を完全には理解していなかったので、質問しなければなりません:-)

IBaseClassインターフェイスを実装するBaseClassを使用しています。これらのインターフェイスには、宣言が1つだけ含まれています。

public interface IBaseClass
{
    void Refresh ();
}

したがって、BaseclassにRefreshメソッドを実装しました。

    public void Refresh ()
    {
        Console.WriteLine("Refresh");
    }

ここで、これらのBaseclassから拡張し、IBaseClassインターフェイスを実装するいくつかのクラスを使用したいと思います。

    public class ChildClass : BaseClass,IBaseClass
    {
    }

しかし、BaseClassに「Refresh」を実装したため、メソッドを再度実装する必要はありません。BaseClassのすべての子と、childclassのすべての子クラスに「更新」の実装を強制するには、どうすればよいですか。

ありがとうkooki

4

6 に答える 6

4

指定した方法で派生クラスにメソッドを再実装させることはできません。3つのオプションがあります。

  1. refresh基本クラスで定義しないでください。インターフェイスは、子クラスにそれを実装するように強制します。
  2. 唯一の目的が実装を強制し、基本クラスを宣言することである場合は、インターフェイスをEschewします。また、実装を提供しない場合abstractrefreshあります。
  3. refresh基本クラスでとして定義しvirtualます。これによりオーバーライドが可能になりますが、強制されることはありません。これがどのように機能するかToString()です。

これはすべて、基本クラスが単一のメソッドよりも大きいことを前提としています。確かにあなたのコードがあなたが投稿したものとまったく同じであるなら、Odedの答えが最良の選択です。

于 2012-12-11T10:14:15.880 に答える
3

単純。基本クラスの実装を提供しないでください。継承するすべてのクラスにメソッドを実装する必要があります。

それを達成する1つの方法は、BaseClass 抽象化することです。

public abstract BaseClass : IBaseClass
{
    public abstract void Refresh();
}
于 2012-12-11T10:14:24.007 に答える
3

BaseClassのすべての子と、childclassのすべての子クラスに「更新」の実装を強制するには、どうすればよいですか。

このような:

interface IBase
{
    void Refresh();
}

abstract class BaseClass : IBase
{
    public abstract void Refresh();
}

class ChildClass : BaseClass
{
    public override void Refresh()
    {
        // Your code
    }
}

インターフェイスを省略することもできます(私の親指のルール:インターフェイスが1つのクラスによって実装される場合は、インターフェイスをダンプします。インターフェイスに固執しないでください。抽象クラスはインターフェイスをかなり表します。インターフェイスと抽象クラスも参照してください(一般的なOO))。

基本クラスに実装が必要な場合は、次のようにビルドします。

(abstract) class BaseClass ( : IBase)
{
    public virtual void Refresh()
    {
        // Your code
    }
}

次に、派生クラスから呼び出すことができます。

public override void Refresh()
{
    // Your code

    // optionally, to call the base implementation:
    base.Refresh();
}
于 2012-12-11T10:19:53.513 に答える
1

デフォルトの実装を提供する場合は、基本クラスで仮想としてマークして実行します。必要に応じて、サブクラスでその実装をオーバーライドできます。

それ以外の場合は、基本クラスでメソッドを抽象としてマークし、サブクラスがメソッド自体を実装するように強制されます。

于 2012-12-11T10:18:50.427 に答える
1

このステップバイステップを見てみましょう。

1:次のように定義されたコードコントラクトを定義するインターフェイスがあります。

public interface IBase
{
    void Refresh();
}

2:インターフェイスを実装する基本クラスがあります。(refreshの実装がであることに気付くでしょうvirtual。これにより、派生クラスでこのメソッドをオーバーライドできます)。

class Base : IBase
{
    public virtual void Refresh()
    {
        //Implementation
    }
}

3: Baseから派生したスーパークラスがあります。(派生クラスは下位レベルで実行されるため、明示的に実装する必要がないことに気付くIBaseでしょう。これの整合性をテストできることを示します)。

class Child : Base
{
    public override void Refresh()
    {
        base.Refresh(); //You can call this here if you need to perform the super objects Refresh() before yor own.
        //Add your implementation here.
    }
}

この時点で、あなたは考えているかもしれません。「では、ChildはIBaseをどのように実装していますか?」答えは、Baseを介して間接的に実装され、をChild継承するためBase、の実装も取得するということですIBase

したがって、あなたが書くとしたら:

IBase instance = new Child();

本質的に間接的にChild派生するため、これは完全に合法です。IBase

これをテストしたい場合は、コードでこれを行うことができます。

bool canAssign = typeof(IBase).IsAssignableFrom(typeof(Child));
//canAssign should be true as Child can be assigned from IBase.
于 2012-12-11T14:33:51.287 に答える
0

新しいキーワードはその中であなたを助けることができるかもしれません。

namespace ConsoleApplication1
{
    interface IBase
    {
        void Referesh();
    }
    public class Base1 : IBase
    {
        public void Referesh()
        {
            Console.WriteLine("Hi"); 
        }
    }
    public class Class1 : Base1, IBase
    {
        public new void Referesh()
        {
            Console.WriteLine("Bye");
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            Class1 obj = new Class1();
            obj.Referesh();

            Console.ReadKey();
        }
    }
}
于 2012-12-11T10:51:08.517 に答える