簡體   English   中英

如何使用構造函數注入抽象類?

[英]how to use constructor injection with abstract class?

我一直在嘗試學習依賴注入,但在運行代碼時遇到2個錯誤:

  1. DependencyInjection.Message.Sms()必須聲明一個body,因為它沒有標記為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;
        }
    }
}

1)DependencyInjection.Message.Sms()'必須聲明一個主體,因為它沒有標記為abstract,extern或partial

abstract關鍵字(和remove virtual)添加到方法聲明中:

public abstract void Sms();

2)不能隱式地將類型'DependencyInjection.IInterface'轉換為'DependencyInjection.MyClass'。 存在顯式轉換(您是否錯過了演員?)

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

Xyz擁有返回式類型MyClass ,但是在get您返回_myinterface這類型的IInterface

更改為以下內容:

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

改變這個

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

對此

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

你要么給虛擬方法一個體,就像這樣

public virtual void Sms() { }

或者你把它標記為抽象

public abstract void Sms();

編輯:

忘了第二個錯誤。 改變這個

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

對此

public IInterface Xyz
    {
        get { return _myinterface; }
        set { _myinterface = value; }
    }
  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; } } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM