TLDR:仍然可以覆盖抽象属性并同时更改其返回类型,就像可以使用具体属性一样吗?我知道直接的答案是“否”,但是我想知道是否有不涉及添加第二个属性的解决方法。
假设我有这个抽象类:
public abstract class Item {
public abstract string SerialNumber { get; }
public string PartNumber => "34";
}
假设我要一个实现Toy
的Item
类。还要说一下,由于某些原因,我希望SerialNumber
和PartNumber
属性在子类中都为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
并将其作为一个整数来获取。
谢谢!
您试图做的事是不可能的。
原因是您的基类表达了一个契约,其中一部分是它公开的方法的返回类型。
您的子类无法履行此合同:假设您有一个“ ItemSubmitter”类,该类具有一个“ submitItem”方法,该方法在内部执行:]
string partNumberToSubmit = item.PartNumber;
由于示例中的item.PartNumber返回一个int,因此将导致异常。您希望编译器如何处理这种情况?
因此,这是不可能的。这个概念被概括为Barbara Liskov的Liskov替代原理,参见例如https://en.wikipedia.org/wiki/Liskov_substitution_principle。