为什么不能覆盖接口的方法? [英] Why can't I override my interface its methods?
问题描述
假设我有一个如下的界面.
interface CardHolder : IEnumerable<Card>
{
/// <summary> ...
void PutCard(Card card);
/// <summary> ...
void PutCards(Card[] card);
/// Some more methods...
}
我实现如下.
public class ArrayCardHolder : CardHolder
{
private Card[] _cards;
private int _size = 0;
public ArrayCardHolder(int capacity)
{
_cards = new Card[capacity];
}
public void PutCard(Card card)
{
if (IsFull())
throw new Exception("This CardHolder is full. Capacity: " + Capacity());
_cards[_size++] = card;
}
public void PutCards(Card[] cards)
{
if (_size + cards.Length > _cards.Length)
throw new Exception("Adding the Cards would exceed this CardHolder its capacity. Capacity: " + Capacity());
for (int index = 0; index < cards.Length; index++)
_cards[_size++] = cards[index];
}
public IEnumerator<Card> GetEnumerator()
{
for (int index = 0; index < _size; index++)
yield return _cards[index];
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
///More methods.
}
为什么我不能在ArrayCardHolder
中使用override
关键字
(例如public void override PutCard(Card card) { ///implementation }
表示该方法实现了(即覆盖)该接口?在这种情况下,项目将拒绝构建.
为什么覆盖ToString()
时它可以工作?从IComparable<T>
实现CompareTo(T t)
时为什么不起作用?
我应该改用什么?我担心该接口中的文档不适用于我的实现方法.在Java中,使用@Override
批注时就是这种情况.
接口的方法不是覆盖,而是实现.您对抽象/虚拟方法感到困惑.
示例:
public interface IFoo
{
void DoA();
}
public abstract class BaseFoo : IFoo
{
public void DoA() { } // *this HAS to be implemented*
public virtual void DoB() { }
}
public abstract class MyFoo : BaseFoo
{
// *this CAN be implemented, which would override the default implementation*
public override void DoB() { }
}
正如其他人提到的那样,ToString
是基类object
的virtual
方法,这就是为什么您可以覆盖的原因.
Let's say I have an interface as follows.
interface CardHolder : IEnumerable<Card>
{
/// <summary> ...
void PutCard(Card card);
/// <summary> ...
void PutCards(Card[] card);
/// Some more methods...
}
I implement it as follows.
public class ArrayCardHolder : CardHolder
{
private Card[] _cards;
private int _size = 0;
public ArrayCardHolder(int capacity)
{
_cards = new Card[capacity];
}
public void PutCard(Card card)
{
if (IsFull())
throw new Exception("This CardHolder is full. Capacity: " + Capacity());
_cards[_size++] = card;
}
public void PutCards(Card[] cards)
{
if (_size + cards.Length > _cards.Length)
throw new Exception("Adding the Cards would exceed this CardHolder its capacity. Capacity: " + Capacity());
for (int index = 0; index < cards.Length; index++)
_cards[_size++] = cards[index];
}
public IEnumerator<Card> GetEnumerator()
{
for (int index = 0; index < _size; index++)
yield return _cards[index];
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
///More methods.
}
Why can I not use the override
keyword in my ArrayCardHolder
(e.g. public void override PutCard(Card card) { ///implementation }
to indicate that the method implements (i.e. overrides) the interface? In that case, the project will refuse to build.
Why does it work however when overriding ToString()
? And why doesn't it work when implementing CompareTo(T t)
from IComparable<T>
?
What should I use instead? I'm worried that the documentation from the interface will not apply to my implementing methods. Such is the case in Java when the @Override
annotation is used.
Interface's methods are not overriden, they are implemented. You are confused with abstract/virtual methods which can be overriden.
Example:
public interface IFoo
{
void DoA();
}
public abstract class BaseFoo : IFoo
{
public void DoA() { } // *this HAS to be implemented*
public virtual void DoB() { }
}
public abstract class MyFoo : BaseFoo
{
// *this CAN be implemented, which would override the default implementation*
public override void DoB() { }
}
As others metioned, ToString
is a virtual
method of the base class object
, that is why you can override it.
这篇关于为什么不能覆盖接口的方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!