![](/img/trans.png)
[英]How to make a list of something that implements abstract class and interface (C#)?
[英]My abstract class implements an interface but doesn't implement some of its methods. How do I make it compile?
interface ICanvasTool
{
void Motion(Point newLocation);
void Tick();
}
abstract class CanvasTool_BaseDraw : ICanvasTool
{
protected abstract void PaintAt(Point location);
public override void Motion(Point newLocation)
{
// implementation
}
}
class CanvasTool_Spray : CanvasTool_BaseDraw
{
protected abstract void PaintAt(Point location)
{
// implementation
}
public override void Tick()
{
// implementation
}
}
這不編譯。 我可以添加一個抽象方法“Tick_Implementation”到CanvasTool_BaseDraw,然后實現ICanvasTool.Tick
在CanvasTool_BaseDraw
有一個班輪只是調用Tick_Implementation。 這是推薦的解決方法嗎?
這樣做的方法是向CanvasTool_BaseDraw
添加一個抽象的void Tick()
方法,並在CanvasTool_Spray
覆蓋它。
並非每種編程語言都是這樣做的。 在Java中,您不必為您實現的接口中的每個方法添加抽象方法。 在這種情況下,您的代碼將編譯。
你有一些東西混在一起..
Motion應該在您的基類中是虛擬的,以便可以在子類中重寫它。 您的子類需要使用PaintAt覆蓋而不是抽象。 基類需要將Tick作為抽象方法實現。
interface ICanvasTool
{
void Motion(Point newLocation);
void Tick();
}
abstract class CanvasTool_BaseDraw : ICanvasTool
{
protected abstract void PaintAt(Point location);
public virtual void Motion(Point newLocation)
{
// implementation
}
public abstract void Tick();
}
class CanvasTool_Spray : CanvasTool_BaseDraw
{
protected override void PaintAt(Point location)
{
// implementation
}
public override void Tick()
{
// implementation
}
}
另一種方法是不在基類聲明中列出接口。 每個派生類必須在其聲明中列出ICanvasTool,如果它想要實現接口,那么它只負責實現接口的其余部分。 我可以看到的一個缺點是你不能在基類中顯式實現接口方法(即沒有ICanvasTool:Motion),但是否則這是一個相當低的開銷版本。
public interface ICanvasTool
{
void Motion(Point newLocation);
void Tick();
}
public abstract class CanvasTool_BaseDraw
{
public void Motion(Point newLocation)
{
//some implementation
}
}
public class CanvasTool_Spray : CanvasTool_BaseDraw, ICanvasTool
{
public void Tick()
{
//some implementation
}
}
注意:我遺漏了PaintAt,因為這個例子沒有必要。
如前所述,接口是合同,因此所有接口都需要實現。 如果消費者試圖調用界面中定義但未在具體類中實現的內容,則應用程序將崩潰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.