C#用更具体的类型重写抽象属性
我有一个相当简单的问题,但我在任何地方都找不到合适的解决方案。我想在抽象父类中指定一个抽象对象CustomValues作为属性。但是,从中继承的类应该能够使用更特定的类型作为此属性CustomValues的对象。起初我以为我可以通过一个接口来解决这个问题,但不幸的是,这也没有成功。你是怎么做到的,它是怎么工作的C#用更具体的类型重写抽象属性,c#,abstract-class,C#,Abstract Class,我有一个相当简单的问题,但我在任何地方都找不到合适的解决方案。我想在抽象父类中指定一个抽象对象CustomValues作为属性。但是,从中继承的类应该能够使用更特定的类型作为此属性CustomValues的对象。起初我以为我可以通过一个接口来解决这个问题,但不幸的是,这也没有成功。你是怎么做到的,它是怎么工作的 公共抽象类MyAbstract{ 公共抽象对象CustomValues{get;set;} } 公共类MyImplementation:MyAbstract{ 公共重写MySpecifi
公共抽象类MyAbstract{
公共抽象对象CustomValues{get;set;}
}
公共类MyImplementation:MyAbstract{
公共重写MySpecificClass自定义值{get;set;}
}
这将给我带来三个错误:
- 缺少getter的实现
- setter缺少实现
- 类型
和对象
MySpecificClass
- 谢谢大家。我通过正确地使用通用找到了解决方案:
public abstract class MyAbstract<T> {
public abstract T CustomValues { get; set; }
}
public class MyImplementation : MyAbstract<MySpecificClass> {
public override MySpecificClass CustomValues { get; set; }
}
公共抽象类MyAbstract{
公共抽象T自定义值{get;set;}
}
公共类MyImplementation:MyAbstract{
公共重写MySpecificClass自定义值{get;set;}
}
谢谢大家。我通过正确地使用通用找到了解决方案:
public abstract class MyAbstract<T> {
public abstract T CustomValues { get; set; }
}
public class MyImplementation : MyAbstract<MySpecificClass> {
public override MySpecificClass CustomValues { get; set; }
}
公共抽象类MyAbstract{
公共抽象T自定义值{get;set;}
}
公共类MyImplementation:MyAbstract{
公共重写MySpecificClass自定义值{get;set;}
}
评论中建议的解决方案看起来像这样。(我假设CustomValues
应该是一些东西的集合。)
评论中建议的解决方案类似于此。(我假设
CustomValues
应该是一些东西的集合。)
我认为您最初认为使用接口(+通用)的想法是正确的。通常,您可能还需要添加类型约束
public interface ICustomValues {
....
}
public class MySpecificClass : ICustomValues {
....
}
public abstract class MyAbstract<T> where T : ICustomValues {
public abstract T CustomValues {
get;
set;
}
}
public class MyImplementation: MyAbstract<MySpecificClass> {
public override MySpecificClass CustomValues { get; set; }
}
公共接口ICustomValues{
....
}
公共类MySpecificClass:ICustomValues{
....
}
公共抽象类MyAbstract,其中T:ICustomValues{
公共抽象价值观{
得到;
设置
}
}
公共类MyImplementation:MyAbstract{
公共重写MySpecificClass自定义值{get;set;}
}
我认为您最初使用接口(+generic)的想法是正确的。通常,您可能还需要添加类型约束
public interface ICustomValues {
....
}
public class MySpecificClass : ICustomValues {
....
}
public abstract class MyAbstract<T> where T : ICustomValues {
public abstract T CustomValues {
get;
set;
}
}
public class MyImplementation: MyAbstract<MySpecificClass> {
public override MySpecificClass CustomValues { get; set; }
}
公共接口ICustomValues{
....
}
公共类MySpecificClass:ICustomValues{
....
}
公共抽象类MyAbstract,其中T:ICustomValues{
公共抽象价值观{
得到;
设置
}
}
公共类MyImplementation:MyAbstract{
公共重写MySpecificClass自定义值{get;set;}
}
研究派生的泛型类。这就是你要找的<代码>对象是一种非常糟糕的返回类型。您必须将结果强制转换为特定类型,始终冒着错误强制转换的风险。创建泛型方法instead@PanagiotisKanavos问题是,这个CustomValues属性将被JSON.net序列化。我只是想确保,所有派生类都有CustomValues属性。您需要定义T:公共抽象类MyAbstract
(可能是公共抽象类MyAbstract,其中T:class
)FWIW,C#9将有。研究派生泛型类。这就是你要找的<代码>对象是一种非常糟糕的返回类型。您必须将结果强制转换为特定类型,始终冒着错误强制转换的风险。创建泛型方法instead@PanagiotisKanavos问题是,这个CustomValues属性将被JSON.net序列化。我只是想确保所有派生类都有CustomValues属性。您需要定义T:公共抽象类MyAbstract
(可能是公共抽象类MyAbstract,其中T:class
)FWIW,C#9。您可能根本不需要派生类。(只是猜测您认为您需要它,因为您以前不知道如何使用泛型。)@stacktoverp该类用于通过REST控制API,REST生成报告。根据文档类型(由字符串参数定义,在我的示例中没有),CustomValues必须包含不同的值。所以我的想法是定义一个抽象类,然后为每个文档类型定义一个特定的实现。这个问题能得到更好/更简单的解决吗?我建议阅读有关的内容,并询问您真正想做什么。您可能根本不需要派生类。(只是猜测您认为您需要它,因为您以前不知道如何使用泛型。)@stacktoverp该类用于通过REST控制API,REST生成报告。根据文档类型(由字符串参数定义,在我的示例中没有),CustomValues必须包含不同的值。所以我的想法是定义一个抽象类,然后为每个文档类型定义一个特定的实现。这个问题能得到更好/更简单的解决吗?我建议你读一读关于这个问题的书,问一个关于你真正想做什么的问题。