我想知道两个约定之间的区别:
- 使用抽象方法创建抽象基类 稍后将在派生类上实现。
- 创建没有抽象方法的抽象基类
但稍后在派生类级别添加相关方法。
有什么区别?
最佳答案
与接口(interface)非常相似,抽象类旨在为您的类型表达一组已知操作。然而,与接口(interface)不同,抽象类允许您实现可由任何派生类型使用的公共(public)/共享功能。例如:
public abstract class LoggerBase
{
public abstract void Write(object item);
protected virtual object FormatObject(object item)
{
return item;
}
}
在上面这个非常基本的例子中,我基本上做了两件事:
- 定义了我的派生类型将遵守的契约。
- 提供一些默认功能,如果需要可以覆盖这些功能。
鉴于我知道 LoggerBase
的任何派生类型都有一个 Write
方法,我可以调用它。上面的等效接口(interface)可以是:
public interface ILogger
{
void Write(object item);
}
作为一个抽象类,我可以提供一个额外的服务FormatObject
,它可以被选择性地覆盖,比如我正在写一个ConsoleLogger
,例如:
public class ConsoleLogger : LoggerBase
{
public override void Write(object item)
{
Console.WriteLine(FormatObject(item));
}
}
通过将 FormatObject
方法标记为虚拟方法,这意味着我可以提供共享实现。我也可以覆盖它:
public class ConsoleLogger : LoggerBase
{
public override void Write(object item)
{
Console.WriteLine(FormatObject(item));
}
protected override object FormatObject(object item)
{
return item.ToString().ToUpper();
}
}
所以,关键部分是:
抽象
类必须继承。抽象
方法必须在派生类型中实现。virtual
方法可以在派生类型中被覆盖。
在第二种情况下,因为您不会向抽象基类添加功能,所以在直接处理基类的实例时无法调用该方法。例如,如果我实现了 ConsoleLogger.WriteSomethingElse
,我就无法从 LoggerBase.WriteSomethingElse
调用它。
关于c# - 抽象方法使用与常规方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5601222/