如何使用构造函数注入抽象类?

时间:2012-11-14 08:00:00

标签: c# .net oop design-patterns dependency-injection

我一直在尝试学习依赖注入,但在运行代码时遇到2个错误:

  1. DependencyInjection.Message.Sms()必须声明一个正文,因为它没有标记为abstract,extern或partial。
  2. 无法隐式将DependencyInjection.IInterface类型转换为DependencyInjection.MyClass。存在显式转换(您是否错过了演员?)
  3. 下面的代码是否适合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;
            }
        }
    }
    

3 个答案:

答案 0 :(得分:4)

  

1)DependencyInjection.Message.Sms()'必须声明一个正文,因为它没有标记为abstract,extern或partial

abstract关键字(并删除虚拟)添加到方法声明:

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; }
}

答案 1 :(得分: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();

编辑:

忘了第二个错误。改变这个

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

到这个

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

答案 2 :(得分:0)

  1. 你宣布一个没有身体的虚拟方法。虚方法必须声明一个将作为方法的默认实现的主体。您可以将方法声明为abstract,这意味着派生类必须提供自己的实现:

    public abstract void Sms();
    

    或者您可以将方法保持为虚拟并在基类中提供默认实现:

    public virtual void Sms()
    {
        // Default or no implementation goes here.
    }
    
  2. 在以下代码中,您尝试将IInterface投射到MyClass,这可能不是您想要的。

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

    您可能希望返回IInterface

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