如何修改所有派生类中的方法返回值
本文关键字:派生 返回值 方法 何修改 修改 | 更新日期: 2023-09-27 18:25:12
假设您有一个类层次结构:
class Base
{
public virtual string GetName()
{
return "BaseName";
}
}
class Derived1 : Base
{
public override string GetName()
{
return "Derived1";
}
}
class Derived2 : Base
{
public override string GetName()
{
return "Derived2";
}
}
在最合适的方式中,如何以所有"GetName"方法都将"XX"字符串添加到派生类中的返回值的方式编写代码?
例如:
Derived1.GetName returns "Derived1XX"
Derived2.GetName returns "Derived2XX"
更改GetName方法实现的代码不是一个好主意,因为可能存在几种派生类型的Base。
将GetName
保留为非虚拟,并将"append XX"逻辑放入该函数中。将名称(不带"XX")提取到受保护的虚拟函数,并在子类中覆盖该名称。
class Base
{
public string GetName()
{
return GetNameInternal() + "XX";
}
protected virtual string GetNameInternal()
{
return "BaseName";
}
}
class Derived1 : Base
{
protected override string GetNameInternal()
{
return "Derived1";
}
}
class Derived2 : Base
{
protected override string GetNameInternal()
{
return "Derived2";
}
}
这是装饰器模式的一个很好的用例。创建一个引用Base:的装饰器
class BaseDecorator : Base
{
Base _baseType;
public BaseDecorator(Base baseType)
{
_baseType = baseType;
{
public override string GetName()
{
return _baseType.GetName() + "XX";
}
}
用您选择的类(Base或Derived)构造一个BaseDecorator,并调用它的GetName。
如果您不想(或不能)修改原始类,可以使用扩展方法:
static class Exts {
public static string GetNameXX (this Base @this) {
return @this.GetName() + "XX";
}
}
您将能够像往常一样访问新方法:
new Derived1().GetNameXX();
您可以将名称的构造拆分为各种可重写的部分,然后重写每个不同子类中的每个部分。下面就是一个这样的例子。
public class Base {
public string GetName() {
return GetPrefix() + GetSuffix();
}
protected virtual string GetPrefix() {
return "Base";
}
protected virtual string GetSuffix() {
return "";
}
}
public class DerivedConstantSuffix : Base {
protected override string GetSuffix() {
return "XX";
}
}
public class Derived1 : DerivedConstantSuffix {
protected override string GetPrefix() {
return "Derived1";
}
}
public class Derived2 : DerivedConstantSuffix {
protected override string GetPrefix() {
return "Derived2";
}
}
重写可以调用它的基函数。。。然后,您可以修改基类以在其中附加所需的字符。