hel*_*ker -1 c# polymorphism setter inheritance properties
我在类层次结构中有以下设计目标:
有BaseClass一些定义的属性,通常是读/写:
public class Media
{
public virtual object Content { get; set; }
public virtual double recordingLength { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
目的是有一些子类,其中此属性现在是只读的:
public class CompactDisk : Media
{
public override object Content
{
get { return this.getContent(); }
set {
// THERE SHOULDN'T BE A SETTER
}
}
public override double recordingLength
{
get { return 74; }
set {
// NO SETTER EITHER HERE!
}
}
}
Run Code Online (Sandbox Code Playgroud)
我迷失在这里,因为我不知道应该如何实现我的设计意图.
一种可能的方法是使用接口.
您可以将基本概念拆分为两个界面:
public interface IWritableMedia
{
object Content { set; }
double recordingLength { set; }
}
public interface IReadOnlyMedia
{
object Content { get; }
double recordingLength { get; }
}
Run Code Online (Sandbox Code Playgroud)
然后CompactDisk应该只实现IReadOnlyMedia:
public class CompactDisk : IReadOnlyMedia
{
public object Content { get { return ......; } }
public double recordingLength { get { return .......; } }
}
Run Code Online (Sandbox Code Playgroud)
如果要实现CD-RW(可重写),则应实现两个接口:
public class RewritableCompactDisk : IReadOnlyMedia, IWritableMedia
{
public object Content { get; set; }
public double recordingLength { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这样您可以将变量键入为:IReadOnlyMedia或IWritableMedia:
IReadOnlyMedia media = new CompactDisk();
IWritableMedia media2 = new RewritableCompactDisk();
Run Code Online (Sandbox Code Playgroud)
现在问题是IWritableMedia没有提供getter而你不想声明另一个类型的变量IReadOnlyMedia.解决方案是设计第三个接口, IReadWriteMedia并且RewritableCompactDisk应该实现它:
public interface IReadWriteMedia : IReadOnlyMedia, IWritableMedia
{
}
public class RewritableCompactDisk : IReadWriteMedia
{
public object Content { get; set; }
public double recordingLength { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
由于IReadWriteMedia实现了IReadOnlyMedia和IWritableMedia,现在您可以使用IReadWriteMedia键入变量并访问getter和setter:
IReadWriteMedia media3 = new RewritableCompactDisk();
object content = media3.Content;
media3.Content = "hello world";
Run Code Online (Sandbox Code Playgroud)