访问从基类继承的类属性

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)

Adr*_*iro 5

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

您应该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 的建议。不要强制转换为类型,而是强制转换为接口。但所有这些对我来说仍然很糟糕:我坚信你可以改进你的设计。

  • @downvoter 请评论否决票。让我们让这个社区更具建设性。 (2认同)