gpt4 book ai didi

c# - 如何在派生类中隐藏基类公共(public)属性

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

我想在派生类中隐藏基本公共(public)属性(数据成员):

class Program
{
static void Main(string[] args)
{
b obj = new b();
obj.item1 = 4;// should show an error but it doent ???
}
}

class a
{
public int item1 {get; set;}
public int item2 { get; set; }
}

class b : a
{
new private int item1;
}

class c : a
{

}

我有一个公开的成员,因为我想在c类中继承该成员,但想在b类中隐藏该成员,我该怎么做?

难道我不能选择在我的基类中有选择地继承我想要的变量吗???那真的很糟糕,我认为 ms 应该为我们提供一个选项(可能是一个修饰符)来执行此操作


编辑:

我自己找到了答案(我听到很多人说这在 C# 中是不可能的,但你可以做到)

我把代码包括进来以防它有用

class Program
{
static void Main(string[] args)
{
b obj = new b();
obj.item1 = 4; // shows an error : )
}
}

class a
{
public int item1 { get; set; }
public int item2 { get; set; }
}

class b : a
{
new public static int item1
{
get;
private set;
}
}

最佳答案

我将尝试通过示例来解释为什么这是一个坏主意,而不是使用晦涩难懂的术语。

您的建议是使用如下所示的代码:

public class Base
{
public int Item1 { get; set; }
public int Item2 { get; set; }
}


public class WithHidden : Base
{
hide Item1; // Assuming some new feature "hide" in C#
}

public class WithoutHidden : Base { }

这将使以下代码无效:

WithHidden a = new WithHidden();
a.Item1 = 10; // Invalid - cannot access property Item1
int i = a.Item1; // Invalid - cannot access property Item1

这正是您想要的。但是,假设我们现在有以下代码:

Base withHidden = new WithHidden();
Base withoutHidden = new WithoutHidden();

SetItem1(withHidden);
SetItem1(withoutHidden);

public void SetItem1(Base base)
{
base.Item1 = 10;
}

编译器不知道 SetItem1 中的参数 base 是什么运行时类型,只知道它至少是 Base 类型(或从 Base 派生的某种类型,但它无法分辨是哪一种——这可能是显而易见的查看代码片段,但更复杂的场景使其几乎不可能)。

因此,在大部分情况下,编译器不会给出 Item1 实际上不可访问的编译器错误。这样就留下了运行时检查的可能性。当您尝试在一个实际上是 WithHidden 类型的对象上设置 Item1 时,它会抛出异常。

现在访问任何成员,任何非密封类(大多数)上的任何属性都可能引发异常,因为它实际上是隐藏成员的派生类。任何公开任何非密封类型的库在访问任何成员时都必须编写防御代码,因为有人可能已经隐藏了它。

对此的一个潜在解决方案是编写功能,以便只有声明自己可隐藏的成员才能被隐藏。然后,编译器将禁止对该类型变量的隐藏成员进行任何访问(编译时),并且还包括运行时检查,以便在将其强制转换为基本类型并尝试从该类型(运行时)访问时抛出 FieldAccessException .

但即使 C# 开发人员确实为这个功能带来了巨大的麻烦和费用(记住,功能是昂贵的,尤其是在语言设计方面)仍然必须编写防御代码来避免这些问题潜在的 FieldAccessExceptions 被抛出,那么与重组继承层次结构相比,您获得了什么优势?有了新的成员隐藏功能,您的应用程序和库中就会有大量潜在的错误位置,从而增加开发和测试时间。

关于c# - 如何在派生类中隐藏基类公共(public)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1443886/

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