我何时应该使用接口,何时应该使用基类?
如果我不想实际定义方法的基本实现,它应该始终是一个接口吗?
如果我有狗和猫类.为什么我要实现IPet而不是PetBase?我可以理解有ISheds或IBarks(IMakesNoise?)的接口,因为那些可以基于宠物放在宠物上,但我不明白哪个用于通用Pet.
我有一些数字Processor类可以完成两个非常不同的事情,但是从公共代码调用("控制反转"情况).
我想知道在决定它们是否应该全部继承BaseProcessor或实现IProcessor为接口时,我应该认识(或认识到,对于你的USsers)的设计考虑因素.
当抽象类实现接口时,还需要定义或声明方法(如前所述):
public interface MyInterface
{
void Method();
}
public abstract class MyAbstractClass : MyInterface
{
public abstract void Method(); // required, even though MyAbstractClass does not implement
}
public class MyClass : MyAbstractClass
{
public override void Method()
{
}
}
public interface MyInterface2 : MyInterface
{
// no need to declare Method() -- why can't abstract classes do the same for unimplemented methods?
}
Run Code Online (Sandbox Code Playgroud)
c#语言的设计原理是什么要求定义实现接口的抽象类的抽象方法?对于一个抽象类来说,定义一个它没有实现的方法似乎是完全多余的(并且更糟糕的是,对于实际实现该方法必须将该方法标记为覆盖的类).我没有理由认为抽象类的行为不像MyInterface2,它继承自MyInterface但不需要声明MyInterface的方法.
假设我们有这样的代码:
interface I
{
int P { get; }
}
class A : I
{
public virtual int P { get { return 0; } }
}
class B : A
{
public override int P { get { return 1; } }
}
class C : B, I
{
public int P { get { return 2; } }
}
A c = new C();
I ic = new C();
Run Code Online (Sandbox Code Playgroud)
现在的问题是什么是cP和ic.P?其实我知道它会是1和2,但你能解释一下为什么吗?