[英]how to use constructor injection with abstract class?
我一直在嘗試學習依賴注入,但在運行代碼時遇到2個錯誤:
DependencyInjection.Message.Sms()
必須聲明一個body,因為它沒有標記為abstract,extern或partial。 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; }
}
你聲明一個沒有身體的虛擬方法。 虛方法必須聲明一個將作為方法的默認實現的主體。 您可以將方法聲明為abstract
,這意味着派生類必須提供自己的實現:
public abstract void Sms();
或者您可以將方法保持為虛擬並在基類中提供默認實現:
public virtual void Sms() { // Default or no implementation goes here. }
在下面的代碼中,您試圖將IInterface
為MyClass
,這可能不是您想要的。
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.