2008-11-05 2 views
1

Просто интересно, есть ли способ сделать следующее:Изменить возврат подпись через наследование - полиморфизм

public Interface IDataField 
{ 
    object GetValue(); 
} 

public Interface IComplexDataField : IDataField 
{ 
    object GetDefaultValue(); 
} 

public class MyBase 
{ 
    private IDataField _DataField; 

    public MyBase() 
    { 
     this._DataField = this.CreateDataField(); 
    } 

    public virtual IDataField CreateDataField() 
    { 
     return new DataField(); //Implements IDataField 
    } 

    **public virtual IDataField GetDataField()** 
    { 
     return this._DataField; 
    } 

    public void SomeMethod() 
    { 
     this.GetDataField().GetValue(); 
    } 
} 


public class MyComplexBase : MyBase 
{ 
    public override IDataField CreateDataField() 
    { 
     return new ComplexDataField(); //Implements IComplexDataField which Implements IDataField 
    } 

    **public override IComplexDataField GetDataField()** 
    { 
     return (IComplexDataField)base.GetDataField(); 
    } 

    public void SomeComplexSpecificMethod() 
    { 
     this.GetDataField().GetValue(); 
     this.GetDataField().GetDefaultValue(); 
    } 
} 

Приветствие Энтони

+0

Это, как представляется, является точной копией http://stackoverflow.com/questions/157119/c-can-i-override-with-derived-types – 2008-11-05 22:11:39

ответ

4

Что вы хотите ковариации типов возврата. Это не существует в C#.

Не могли бы вы, возможно, сделать MyBase родовое:

public class MyBase<T> where T : IDataField 
{ 
    public virtual T CreateDataField() 
    { 
     ... etc ... 
    } 
} 

В качестве альтернативы, вы можете переопределить метод с «новым» и теневой метод базового класса. Не является особенно привлекательным ...

1

Ближайшими вы можете получить в C# 3.0 должны иметь отдельный virtual метод (например, ваш метод CreateDataField), что делает фактическую работу и может быть отменено, а затем использовать new повторно объявить публичный метод. то есть в базе:

public IDataField GetDataField() 
{ 
    return GetDataFieldImpl(); 
} 
protected virtual IDataField GetDataFieldImpl() 
{ 
    // return a basic version 
} 

и подкласса:

protected override IDataField GetDataFieldImpl() 
{ 
    // do something more fun 
} 
public new IComplexDataField GetDataField() 
{ 
    return (IComplexDataField)GetDataFieldImpl(); 
} 
0

Что вы пытаетесь сделать, это называется возвращаемые типы КОВАРИАНТНОЙ. Они не существуют в текущей версии C#, но есть разговоры о том, что она вводится для следующей версии.

Ваш лучший подход объясняется здесь: covariant return types

public class MyBase<T> where T : IDataField, new() 
{ 
    public virtual T CreateDataField() 
    { 
     return new T(); 
    } 

    public virtual T GetDataField() 
    { 
     return this._DataField; 
    } 

} 

public class MyComplexBase : MyBase<ComplexDataField> 
{ 
    ... 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^