【问题标题】:When would you want to use C#'s `new` modifier to shadow a method?您何时想使用 C# 的 `new` 修饰符来隐藏方法?
【发布时间】:2021-09-16 13:10:20
【问题描述】:

所以new modifier 隐藏了一个方法而不是覆盖它...

我能想到的情况几乎为零,这对代码的开发人员、维护人员和客户来说是有用的并且不会混淆。

什么是实际使用这个修饰符来阴影方法的好例子?

即一个例子

  • 不仅仅是打印一个简单的字符串来演示修饰符的作用,
  • 在哪里使用 new 而不是 override 显然是有利的,并且
  • 这不是“我想覆盖我不允许覆盖的东西”(因为这 [a] 只是糟糕的设计,而 [b] 可能会导致非常混乱的代码行为)

【问题讨论】:

  • docs.microsoft.com/en-us/previous-versions/visualstudio/… 是的,在实践中,它很少有用。要理解的关键是new 有两个方面。 a) 支持阴影。 b) 需要明确了解您正在跟踪的事实。 b) 是主要的好处 - 它突出了阴影,而不会让您意外这样做。
  • 另见 softwareengineering.stackexchange.com/questions/153738/…docs.microsoft.com/en-us/archive/blogs/ericlippert/…(请特别阅读 GetEnumerator 位,因为它提供了一个很好的例子)。
  • 我想你可以用它来实现静态计数,例如游戏中的敌人,其中 Base.Count 将是总敌人数,而 Derived.Count 将是特定敌人类型数(以及与静态计数器或统计数据等交互的一些方法)
  • @mjwills 这些是解决问题的有趣链接。一个用例是在代码演化过程中,当一个方法被添加到与我已经添加到派生类中的方法同名的基类中(例如,在我无法控制的外部 API 中)。最快的解决方法是隐藏方法(尽管从长远来看,使用不同的名称重构可能更好。)

标签: c# inheritance polymorphism shadowing


【解决方案1】:

几乎所有我使用阴影的情况都与泛型有关。泛型经常出现的一个问题是您希望将不同的泛型类型添加到列表中。例如,

class Person {}
class Employee : Person {}
class Student : Person {}

class Company {}

class Account<T> {
    public T AccountHolder { get; set; }
}

var accounts = new List<Account<object>>();

// This does not work!
var empAccount = new Account<Employee>();
var studentAccount = new Account<Student>();
var companyAccount = new Account<Company>();
accounts.Add(empAccount);
accounts.Add(studentAccount);
accounts.Add(companyAccount);

为了让它工作,我们创建了一个帐户类的非泛型基类

class Account {
    public object AccountHolder { get; set; }
}

class Account<T> : Account {
    public new T AccountHolder { 
        get { return (T)base.AccountHolder; }
        set { base.AccountHolder = value; } 
    }
}

现在,我们可以使用非通用帐户类将列表声明为List&lt;Account&gt;

IEnumerable / IEnumerable&lt;T&gt; 接口使用这种方法。请参阅Reference Source(这是 .NET Framework 的当前开源实现)。

【讨论】:

猜你喜欢
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
相关资源
最近更新 更多