gpt4 book ai didi

c# - 从基类访问继承的类属性

转载 作者:行者123 更新时间:2023-11-30 14:17:02 25 4
gpt4 key购买 nike

我有基类和两个继承类,这两个继承类也共享这两个属性。我想从基类访问这些属性。怎么做?下面的例子。

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

最佳答案

如果您需要从基类访问一个属性,那您就做错了。在您 future 的设计中记住这一点。

你应该声明FileStorage在基类中,因为两个继承类都有它。

如果你不想定义FileStorage的特定类型(例如 byte[] ),您可能希望将其定义为更通用的类型,例如 IEnumerable<byte> .或者,您可以声明 FileStorage作为提供您需要从基类访问的任何行为的接口(interface)。

更新

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

讨厌吧?但它应该看起来很脏,因为我们试图打破 OO 设计。

更新

另一种方法是按照 Marc Gravell 的建议进行。不是转换为类型,而是转换为接口(interface)。但所有这一切对我来说仍然很糟糕:我坚信你可以改进你的设计。

关于c# - 从基类访问继承的类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6507505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com