2017-05-10 4 views
0

これはどのようにして完全にコンパイルされ、動作するのか分かりません。プロパティを新しいタイプでオーバーライドするにはどうすればよいですか?

ことが可能である場合、それをオーバーライドする場合(Nullable<bool>からboolおよびintからNullable<int>に)プロパティの種類を変更するため?

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     var testBase = new BaseClass(); 
     var testDerived = new DerivedClass(); 

     Console.WriteLine("'" + Convert.ToString(testBase.BaseInt) + "'"); 
     Console.WriteLine("'" + Convert.ToString(testDerived.BaseInt) + "'"); 

     Console.WriteLine("'" + Convert.ToString(testBase.BaseBoolNullable) + "'"); 
     Console.WriteLine("'" + Convert.ToString(testDerived.BaseBoolNullable) + "'"); 
    } 
} 

public class BaseClass 
{ 
    public bool? BaseBoolNullable { get; set; } 
    public int BaseInt { get; set; } 
} 

public class DerivedClass : BaseClass 
{ 
    public new bool BaseBoolNullable { get; set; } 
    public new int? BaseInt { get; set; } 
} 

出力:

'0' 
'' 
'' 
'False' 

答えて

1

あなただけhidden彼らは、しかしないoverridden基本特性を有しています。

DerivedClassのように変更すると、基本クラスのプロパティにアクセスするために、まだ利用可能であることがわかります。

public new bool BaseBoolNullable 
{ 
    get { return base.BaseBoolNullable ?? false; } 
    set { base.BaseBoolNullable = value; } 
} 
public new int? BaseInt 
{ 
    get { return base.BaseInt; } 
    set { base.BaseInt = value ?? 0; } 
} 

あなたはvirtualoverrideを使用した場合、あなたは予想通り、あなたが実際には異なるタイプのプロパティをオーバーライドすることはできません、ということ参照してくださいね。

public class BaseClass 
{ 
    public virtual bool? BaseBoolNullable { get; set; } 
    public virtual int BaseInt { get; set; } 
} 

public class DerivedClass : BaseClass 
{ 
    public override bool BaseBoolNullable { get; set; } 
    public override int? BaseInt { get; set; } 
} 

'DerivedClass.BaseBoolNullable':型が 'ブール?' でなければなりませんオーバーライドされたメンバーのBaseClass.BaseBoolNullable "

「DerivedClass.BaseInt」と一致する:タイプが一致する「int型」でなければなりませんオーバーライドされたメンバーのBaseClass.BaseInt"

+0

それはこのようなコードを書くための大きなコードのにおいです私の質問で?道徳的に間違っているか何かのように – ibiza

+0

必ずしもそうではありません。それはあなたがしようとしていることによると思います。 'testDerived.BaseInt'を参照すると自動的にベース' BaseInt'プロパティが使用されるため、ベースクラスと派生クラスでヌル入力と非ヌル入力を切り替える必要がない場合は、もっと簡単になります。 –

+0

2番目の例はコンパイルされません。 – ibiza

関連する問題