在c#中扩展抽象类

时间:2010-05-05 08:47:51

标签: c# java

我是一名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 }
}

这里编译器抱怨隐藏。有什么建议?

请不要建议使用接口,除非这是执行此操作的唯一方法。

2 个答案:

答案 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语言都允许这样的定义。