2014-07-08 77 views
0

我最近遇到的一些代码有点困惑。这是一个片段。首先,抽象类定义,然后从它继承的类:继承自Abstract类的类需要具有相同签名的方法吗?

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; 
    } 
} 

所以我的理解和抽象类的使用一直是一个抽象类中的任何抽象方法必须在继承的类中重写。如果抽象类中的方法没有声明为抽象类,派生类可以在方法中创建自己的实例,并直接调用抽象类的非抽象方法。

但是在任何情况下,抽象类的方法都用在派生类中。但是,考虑到以前的代码片段,派生类没有直接映射的签名或用法。

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

回答

3

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

那是真的,但方法不是抽象的,他们是具体的(和静态的)。只有虚拟或抽象的实例方法才能被覆盖。

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

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

+0

所示的方法也是静态的,所以不能被覆盖,因为它们存在于类型上,而不是实例。 –

+0

@RobLevine谢谢,修正。 –

+0

D斯坦利 - 你的第一个评论似乎与我说的一致,但你说不?也许你误解了我的评论,或者我错过了什么?“抽象类中的任何抽象方法都必须在继承的类中重写” – Mark

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(); 
    } 
} 
+0

基类方法也受保护,这意味着只有派生类可以看到它们。所以这个类的作者可能试图控制对这些方法的访问(尽管如果公共因任何原因而不可接受的话,内部可能会更好)。 – treed

相关问题