我是一名Java开发人员,我注意到在扩展c#中的抽象类而不是Java时存在一些差异。我想知道c#开发人员将如何实现以下目标。
1)Covarience
public abstract class A {
public abstract List<B> List();
}
public class BList : List<B> {
}
public abstract class C : A {
public abstract BList List();
}
因此,在上面的层次结构中,C中存在协变性,它返回与A返回的类型兼容的类型。但是这在Visual Studio中给出了一个错误。有没有办法在c#中指定协变返回类型?
2)将一个setter添加到一个属性
public abstract class A {
public abstract String Name { get; }
}
public abstract class B : A {
public abstract String Name { get; set }
}
这里编译器抱怨隐藏。有什么建议?
请不要建议使用接口,除非这是执行此操作的唯一方法。
答案 0 :(得分:0)
不知怎的,我不明白你的意图。你为什么不这样解决它?
public class BList : List<T> where T : B {} same = public class BList : List<B> {}
public class C : A
{
public override List<B> Liste()
{
return new BList();
}
}
关于你的第二个问题:
你想要做的是我眼中的糟糕设计。您可以在两者上使用关键字virtual并忽略警告,但为什么要这样做呢?
public abstract class A
{
public virtual string Name { get; protected set; }
}
public abstract class B : A
{
public virtual string Name { get; set;}
}
答案 1 :(得分:0)
C#中不支持这些。底层运行时(CLR)也不支持协变返回。
似乎可以在CLR上的属性示例中执行某些操作,但不能在C#中执行。在引擎盖下,属性基本上由名称,属性类型以及对getter和setter方法(如果适用)的引用组成,这些方法通常名为get_<Property>
和set_<Property>
(但不是必需的)在非符合CLS的类中遵循该约定。可以在只具有getter的基类中创建属性,然后在派生类中使用相同名称和getter创建另一个属性,但该属性具有自己的setter。但是,我不知道任何.NET语言都允许这样的定义。