从Abstract Classes继承的类是否需要具有相同签名的方法?

时间:2014-07-08 15:37:10

标签: c# inheritance abstract-class

我对最近遇到的一些代码感到有些困惑。这是一个片段。第一个抽象类定义,然后是继承自它的类:

public abstract class BaseClass
{
    protected static void MapEntityToModel(string paramOne, List<TypeDef> types)
    {
        // Some Logic Here
    }
    protected static void MapModelToEntity(ModelType model, ResultType result)
    {
        // Some Logic Here
    }
} 

public class BaseExtension : BaseClass
{
    public static ViewModel MapModelToViewModel(Model m)
    {
        var result = new ViewModel();
        // Some Logic Here
        return result;
    }
    public static List<ViewModel> MapModelsToViewModels(List<TModel> models)
    {
        return models.Select(m => MapModelToViewModel(m)).ToList();
    }

    public static Model MapViewModelToModel(ViewModel v)
    {
        var result = new Model();
        // Some Logic Here
        return result;
    }
}

所以我对抽象类的理解和使用一直是,在继承的类中必须覆盖抽象类中的任何抽象方法。如果抽象类中的方法未声明为抽象,则派生类可以在方法中创建自身的实例,并直接调用抽象类的非抽象方法。

但在任何一种情况下,抽象类的方法都在Derived Class中使用。但是,鉴于以前的代码片段,派生类没有直接映射的签名或用法。

这个特定场景中抽象类的目的是什么?为什么它编译时没有错误?我显然缺少抽象类的一些概念及其适当的实现。

2 个答案:

答案 0 :(得分:3)

静态方法不是类

的实例的一部分

当你说一个类是抽象的时,你说你不能创建它的实例。

除了突出显示创建它们的实例毫无意义之外,这些类的摘要没有用处,因为所有方法都是静态的。

同样继承它们似乎有点无意义,因为没有任何东西被继承 - 所有成员都是静态的。 你可能只有继承的类,并使基类成为一个空接口,并将其中的静态方法移动到继承的类中(接口实际上是一个没有方法实现的抽象类 - 但你通常会拥有效果抽象方法定义虽然)

abstract class a
{
    public  abstract string look();

    public static string lookStatic()
    {
        return "look";
    }
}

class b : a
{
    public override string look()
    {
        return "look member";
    }
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(b.lookStatic());
        var test = new b();
        Console.WriteLine(test.look());
        var c = (a) test;
        Console.WriteLine(c.look());
        Console.ReadLine();
    }
}

答案 1 :(得分:3)

  

所以我对抽象类的理解和使用一直是抽象类中的任何抽象方法都必须在继承的类中重写

这是事实,但方法不是抽象的,它们是具体的(和静态的)。只能覆盖虚拟或抽象实例方法。

  

这个特定场景中抽象类的目的是什么?为什么编译时没有错误?

由于类没有抽象方法或属性,我不明白为什么它是抽象的,除了作者没有因某种原因创建的实例。