5

たとえば、抽象クラスを拡張し、インターフェイスを実装するクラスがある場合はどうなりますか。

class Example : AbstractExample, ExampleInterface
{
    // class content here
}

インターフェイスと抽象クラスの両方からメソッドにアクセスできるように、このクラスを初期化するにはどうすればよいですか?

私がする時:

AbstractExample example = new Example();

インターフェイスからメソッドにアクセスできません。

4

5 に答える 5

10

必要がある

  • AbstractExampleでインターフェースを実装します
  • または例への参照を取得します

Example example = new Example();

于 2009-04-25T18:51:33.627 に答える
6

最後の例では、インターフェースまたは抽象クラスのいずれかの堅実なインスタンスに結び付けられますが、これはあなたの目標ではないと思います。悪いニュースは、ここでは動的型付けされた言語を使用していないため、以前にsprcifiedまたはキャスト/アンキャストされたソリッド「Example」オブジェクト。

AbstractExample example = new Example();
((IExampleInterface)example).DoSomeMethodDefinedInInterface();

他の代替手段は、AbstractExampleとIExampleInterfaceの両方に共通のインターフェースを実装させることです。

abstract class AbstractExample : ICommonInterface
interface IExampleInterface : ICommonInterface
class Example : AbstractExample, IExampleInterface

これで、ICommonInterfaceを操作して、抽象クラスとIExampleインターフェイスの実装の両方の機能を使用できるようになりました。

これらの答えのいずれも受け入れられない場合は、.NETフレームワーク(IronPython)で実行されるDLR言語のいくつかを調べることをお勧めします。

于 2009-04-25T19:03:34.533 に答える
5

抽象クラスしか知らない場合は、のインスタンスを介して実際の型を知っていることを示唆していますType。したがって、ジェネリックを使用できます。

private T SomeMethod<T>()
    where T : new(), AbstractExample, ExampleInterface
{
    T instance = new T();
    instance.SomeMethodOnAbstractClass();
    instance.SomeMethodOnInterface();
    return instance;
}
于 2009-04-25T19:00:07.380 に答える
1

使用する:

Example example = new Example();

詳細情報の後に更新:

ExampleInterfaceを実装していることが確実な場合は、次を使用できます。

AbstractClass example = new Example();
ExampleInterface exampleInterface = (ExampleInterface)example;
exampleInterface.InterfaceMethod();

また、インターフェイスをチェックして、実際に実装されていることを確認することもできます。

if (example is ExampleInterface) {
    // Cast to ExampleInterface like above and call its methods.
}

Genericsはコンパイル時に解決されるため、Genericsが役立つとは思いません。また、AbstractClassへの参照しかない場合は、コンパイラーが文句を言います。

編集:オーウェンが言ったことは多かれ少なかれ。:)

于 2009-04-25T18:51:00.960 に答える
1

この例が役立つと思います:

public interface ICrud
{
    void Add();
    void Update();
    void Delete();
    void Select();
}

public abstract class CrudBase
{
    public void Add()
    {
        Console.WriteLine("Performing add operation...");
        Console.ReadLine();
    }

   public void Update()
    {
        Console.WriteLine("Performing update operation...");
        Console.ReadLine();
    }
    public void Delete()
    {
        Console.WriteLine("Performing delete operation...");
        Console.ReadLine();
    }
    public void Select()
    {
        Console.WriteLine("Performing select operation...");
        Console.ReadLine();
    }
}

public class ProcessData : CrudBase, ICrud
{

}

var process = new ProcessData();
process.Add();
于 2013-01-30T07:28:09.527 に答える