gpt4 book ai didi

c# - 如何在不修改继承类(基类)的情况下隐藏类中的继承属性?

转载 作者:IT王子 更新时间:2023-10-29 03:55:04 27 4
gpt4 key购买 nike

如果我有以下代码示例:

public class ClassBase
{
public int ID { get; set; }

public string Name { get; set; }
}

public class ClassA : ClassBase
{
public int JustNumber { get; set; }

public ClassA()
{
this.ID = 0;
this.Name = string.Empty;
this.JustNumber = string.Empty;
}
}

如何在不修改 ClassBase 的情况下隐藏属性 Name(不显示为 ClassA 成员的成员)?

最佳答案

我在这里闻到了代码味。我认为,只有在实现基类的所有功能时才应继承该基类。您正在做的事情并没有真正正确地代表面向对象的原则。因此,如果你想从你的基础继承,你应该实现 Name,否则你的继承方式是错误的。你的类 A 应该是你的基类,如果你想要的话,你当前的基类应该从 A 继承,而不是相反。

但是,不要偏离直接问题太远。如果您确实想藐视“规则”并想继续您选择的道路 - 以下是您可以采取的方法:

约定是实现该属性,但在调用该属性时抛出 NotImplementedException - 尽管我也不喜欢那样。但这是我个人的看法,并不能改变这个公约仍然有效的事实。

如果您试图废弃该属性(并且它在基类中声明为虚拟),那么您可以在其上使用 Obsolete 属性:

[Obsolete("This property has been deprecated and should no longer be used.", true)]
public override string Name
{
get
{
return base.Name;
}
set
{
base.Name = value;
}
}

(编辑:正如 Brian 在评论中指出的那样,如果有人引用 Name 属性,属性的第二个参数将导致编译器错误,因此他们甚至无法使用它尽管你已经在派生类中实现了它。)

或者像我提到的那样使用 NotImplementedException:

public override string Name
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}

但是,如果属性没有声明为虚拟的,那么您可以使用 new 关键字来替换它:

public new string Name
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}

您仍然可以像重写该方法一样使用 Obsolete 属性,或者您可以抛出 NotImplementedException,无论您选择哪种方式。我可能会使用:

[Obsolete("Don't use this", true)]
public override string Name { get; set; }

或:

[Obsolete("Don't use this", true)]
public new string Name { get; set; }

取决于它是否在基类中声明为虚拟。

关于c# - 如何在不修改继承类(基类)的情况下隐藏类中的继承属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1875401/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com