1

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

  1. DependencyInjection.Message.Sms()必须声明一个主体,因为它没有标记为抽象、外部或部分。
  2. 无法将类型隐式转换DependencyInjection.IInterfaceDependencyInjection.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在方法声明中添加关键字(并删除虚拟):

public abstract void Sms();

2) 无法将类型“DependencyInjection.IInterface”隐式转换为“DependencyInjection.MyClass”。存在显式转换(您是否缺少演员表?)

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

Xyz具有 type 的 return-typeMyClass但在get您返回_myinterface的是 type IInterface

更改为以下内容:

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();

编辑:

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

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 回答