1

依存性注入を学習しようとしていますが、コードを実行すると 2 つのエラーが発生します。

  1. DependencyInjection.Message.Sms()本体はabstract、extern、またはpartialとマークされていないため、本体を宣言する必要があります。
  2. DependencyInjection.IInterfaceタイプを に 暗黙的に変換することはできませんDependencyInjection.MyClass。明示的な変換が存在します (キャストがありませんか?)

以下のコードは DI に適した設計ですか?

namespace DependencyInjection
{
    public interface IInterface
    {

    }

    public abstract class Message
    {
        public virtual void Sms();
    }

    public class MyClass : Message, IInterface
    {
        public override void Sms()
        {
            Console.WriteLine("Sms gönder.");
        }
    }

    public class ClassManager
    {
        private IInterface _myinterface;


        public MyClass Xyz
        {
            get { return _myinterface; }
            set { _myinterface = value; }
        }

        public ClassManager(IInterface myinterface)
        {
            _myinterface = myinterface;
        }
    }
}
4

3 に答える 3

4

1) DependencyInjection.Message.Sms()' は、abstract、extern、または partial とマークされていないため、本体を宣言する必要があります

abstractメソッド宣言にキーワードを追加(および virtual を削除) します。

public abstract void Sms();

2) タイプ 'DependencyInjection.IInterface' を 'DependencyInjection.MyClass' に暗黙的に変換することはできません。明示的な変換が存在します (キャストがありませんか?)

private IInterface _myinterface;
public MyClass Xyz
{
    get { return _myinterface; }
    set { _myinterface = value; }
}

Xyzは type の return-type を持っていますがMyClass、 type の return-type を返しています。get_myinterfaceIInterface

次のように変更します。

public IInterface Xyz
{
    get { return _myinterface; }
    set { _myinterface = value; }
}
于 2012-11-14T08:07:21.693 に答える
0

これを変える

public abstract class Message
{
    public virtual void Sms();
}

これに

public abstract class Message
{
    public abstract void Sms();
}

次のように、仮想メソッドに本体を指定します

public virtual void Sms() { }

または、抽象としてマークします

public abstract void Sms();

編集:

2番目のエラーを忘れていました。これを変える

public MyClass Xyz
    {
        get { return _myinterface; }
        set { _myinterface = value; }
    }

これに

public IInterface Xyz
    {
        get { return _myinterface; }
        set { _myinterface = value; }
    }
于 2012-11-14T08:03:44.567 に答える
0
  1. 本体のない仮想メソッドを宣言しています。仮想メソッドは、メソッドの既定の実装として機能する本体を宣言する必要があります。メソッドを として宣言することもできますabstract。これは、派生クラスが独自の実装を提供する必要があることを意味します。

    public abstract void Sms();
    

    または、メソッドを仮想のままにして、基本クラスでデフォルトの実装を提供できます。

    public virtual void Sms()
    {
        // Default or no implementation goes here.
    }
    
  2. 次のコードでは、 にキャストしようとしていますがIInterfaceMyClassこれはおそらくあなたが望むものではありません。

    public MyClass Xyz
    {
        get { return _myinterface; }
        set { _myinterface = value; }
    }
    

    あなたはおそらくIInterface代わりに戻りたいと思っています:

    public IInterface Xyz
    {
        get { return _myinterface; }
        set { _myinterface = value; }
    }
    
于 2012-11-14T08:11:17.647 に答える