[C#更改子类中抽象属性的返回类型

问题描述 投票:1回答:1

TLDR:仍然可以覆盖抽象属性并同时更改其返回类型,就像可以使用具体属性一样吗?我知道直接的答案是“否”,但是我想知道是否有不涉及添加第二个属性的解决方法。

假设我有这个抽象类:

public abstract class Item {
  public abstract string SerialNumber { get; }
  public string PartNumber => "34";
}

假设我要一个实现ToyItem类。还要说一下,由于某些原因,我希望SerialNumberPartNumber属性在子类中都为int值,即使它们是基于基的字符串也是如此。见下文:

public abstract class Toy {
  public override int SerialNumber => 5; //Doesn't compile obviously
  public new int PartNumber => int.ParseInt(base.PartNumber); //works fine, refines the type but keeps the value
}

我包括PartNumber只是为了表明我了解new关键字应该如何工作。这部分对我来说很好。

我的问题是:有没有办法同时覆盖和优化SerialNumber的类型?我了解上面的内容不起作用,但是我正在寻找一种简单的解决方法。目标是不要使用额外的属性(例如SerialNumberInt等),以便Toy类的方法可以引用SerialNumber并将其作为一个整数来获取。

谢谢!

c# overriding new-operator abstract
1个回答
0
投票

您试图做的事是不可能的。

原因是您的基类表达了一个契约,其中一部分是它公开的方法的返回类型。

您的子类无法履行此合同:假设您有一个“ ItemSubmitter”类,该类具有一个“ submitItem”方法,该方法在内部执行:]

   string partNumberToSubmit = item.PartNumber;

由于示例中的item.PartNumber返回一个int,因此将导致异常。您希望编译器如何处理这种情况?

因此,这是不可能的。这个概念被概括为Barbara Liskov的Liskov替代原理,参见例如https://en.wikipedia.org/wiki/Liskov_substitution_principle

© www.soinside.com 2019 - 2024. All rights reserved.