1. 方法定义
- 抽象类:
- 抽象类可以包含抽象方法和非抽象方法。抽象方法只有声明,没有实现,必须在抽象类中定义且由子类重写。例如:
public abstract class AbstractClass
{
public abstract void AbstractMethod();
public void NonAbstractMethod()
{
Console.WriteLine("This is a non - abstract method.");
}
}
- 接口:
- 接口中的所有方法都是抽象的,且不能包含方法的实现。方法默认是
public
和 abstract
的,定义时无需显式声明。例如:
public interface IMyInterface
{
void InterfaceMethod();
}
2. 属性定义
- 抽象类:
- 抽象类可以有普通属性和抽象属性。普通属性和一般类中的属性一样,有完整的
get
和 set
访问器实现。抽象属性只有声明,其实现由子类提供。例如:
public abstract class AbstractClassWithProperty
{
public int NormalProperty { get; set; }
public abstract string AbstractProperty { get; set; }
}
- 接口:
- 接口中的属性只能是抽象的,且不提供访问器的实现。与方法类似,属性默认是
public
和 abstract
的。例如:
public interface IInterfaceWithProperty
{
string InterfaceProperty { get; set; }
}
3. 成员修饰符
- 抽象类:
- 抽象类中的成员可以使用各种访问修饰符,如
public
、private
、protected
等。抽象方法通常使用 public
或 protected
修饰,以便子类能够访问并实现它们。例如:
public abstract class AbstractClassWithModifiers
{
private int privateField;
protected abstract void ProtectedAbstractMethod();
}
- 接口:
- 接口成员默认是
public
的,不允许显式指定其他访问修饰符。因为接口的目的是提供一种通用的契约,所有实现接口的类都必须以公开的方式实现接口成员。例如,以下代码是错误的:
// 错误示例,接口成员不能指定非public修饰符
public interface IInvalidInterface
{
private void InvalidMethod();
}
4. 成员实现的强制要求
- 抽象类:
- 继承抽象类的非抽象子类必须实现抽象类中的所有抽象成员。但如果子类也是抽象类,则可以不实现抽象成员,将实现延迟到更具体的子类。例如:
public class SubAbstractClass : AbstractClass
{
// 必须实现抽象方法
public override void AbstractMethod()
{
Console.WriteLine("Implementation of AbstractMethod in SubAbstractClass.");
}
}
- 接口:
- 实现接口的类必须实现接口中的所有成员,除非该类本身也是抽象类。实现接口成员时,必须使用
public
修饰符,以匹配接口成员的默认访问级别。例如:
public class ImplementingClass : IMyInterface
{
public void InterfaceMethod()
{
Console.WriteLine("Implementation of InterfaceMethod.");
}
}
5. 成员默认值
- 抽象类:
- 抽象类中的非抽象成员可以有默认值。例如,非抽象方法可以有方法体,普通属性可以有默认的
get
和 set
实现。
- 接口:
- 接口成员不能有默认值,因为接口只是定义契约,不包含任何实现细节。