Tom*_*mas 3 c# oop inheritance class radix
我有基类和两个继承类,这两个继承类也共享这两个属性。我想从基类访问这些属性。怎么做?下面的例子。
public abstract class ClientEngine
{
public void SaveFile(string fileName);
{
//Not implemented, I get error here because I don't know how to access Inherited class properties
if (FileStorage != null))
File.WriteAllBytes(fileName, FileStorage);
}
}
public interface IEngineEntity
{
byte[] FileStorage { get; set; }
}
public class MyEntity1 : ClientEngine, IEngineEntity
{
public string MyProperty1 {get; set;}
public string MyProperty2 {get; set;}
public byte[] FileStorage { get; set; }
}
public class MyEntity2 : ClientEngine, IEngineEntity
{
public string MyProperty3 {get; set;}
public string MyProperty4 {get; set;}
public byte[] FileStorage { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果您需要从基类访问属性,那么您就做错了。在您未来的设计中请记住这一点。
您应该FileStorage在基类中声明,因为两个继承的类都有它。
如果您不想定义 的FileStorage特定类型(例如byte[]),您可能希望将其定义为更通用的类型,例如IEnumerable<byte>。或者,您可以声明FileStorage为一个接口,提供您需要从基类访问的任何行为。
更新
@ghimireniraj 的一个很好的观察:您还应该尝试从 IEngineEntity 派生 ClientEngine。OO 设计的底线之一是,如果您在所有继承的类中复制行为,那么它应该在基类中。
但是,您真的想从基类访问一些代码吗?你不应该。但如果你确实需要,你可以随时投射:
public abstract class ClientEngine
{
public void SaveFile(string fileName);
{
byte[] fileStorage = null;
if (this is MyEntity1)
{
MyEntity1 me1 = (MyEntity1)this;
fileStorage = me1.FileStorage;
}
else if (this is MyEntity2)
{
MyEntity2 me2 = (MyEntity2)this;
fileStorage = me2.FileStorage;
}
if (fileStorage != null))
File.WriteAllBytes(fileName, fileStorage);
}
}
Run Code Online (Sandbox Code Playgroud)
很讨厌吧?但它应该看起来很脏,因为我们正在尝试打破 OO 设计。
更新
另一种方法是遵循 Marc Gravell 的建议。不要强制转换为类型,而是强制转换为接口。但所有这些对我来说仍然很糟糕:我坚信你可以改进你的设计。