【问题标题】:Implementing an abstract class hierarchy -实现抽象类层次结构 -
【发布时间】:2016-05-02 12:28:58
【问题描述】:

我做一个抽象类层次结构,例如:

abstract public class BaseDirectory {
}

abstract public class BaseUser() {
    protected readonly BaseDirectory _DIR
    BaseUser(BaseDirectory dir) {
        _DIR = dir;
    }
}

然后我实现那个抽象层次结构:

class MyDirectory : BaseDirectory {
    internal void SomeMethod() {
    }
}

class MyUser : BaseUser {
    MyUser(MyDirectory dir) : base(dir)
    {
    }
    internal void SomeMethod() {
        _DIR.SomeMethod(); // <- how to do this?
    }
}

现在,从MyUser 类,我希望能够访问MyDirectory 实例,我当然可以在dir 中期待。 C# 程序员如何在风格上实现这一点? 用包含未转换的 MyDirectory 的私有属性覆盖 MyUser 中的 _DIR,在任何地方都使用转换,完全是什么?

【问题讨论】:

  • 您可以将SomeMethod 添加到BaseDirectory 作为abstract 方法吗?
  • @juharr 假设SomeMethod 特定于MyDirectory/MyUser,并且在其他实现中必须抛出NotImplementedException

标签: c# class abstract-class


【解决方案1】:

这可能取决于用例。但我要做的是在BaseUser 抽象类中使用泛型来指定使用的目录类型:

像这样的图像:

public abstract class BaseDirectory
{

}

public abstract class BaseUser<TDirectory> where TDirectory : BaseDirectory
{
    protected readonly TDirectory _dir;
    protected BaseUser(TDirectory dir)
    {
        _dir = dir;
    }
}

public class MyDirectory : BaseDirectory
{
    public void SpecificMethod() { }
}

public class MyUser : BaseUser<MyDirectory>
{
    public MyUser(MyDirectory dir) : base(dir)
    {

    }

    internal void SomeMethod()
    {
        // call specific method on type MyDirectory
        _dir.SpecificMethod();
    }
}

这样您就可以访问类型为MyDirectory 而不是BaseDirectory 的_dir-Variable。如果您需要多个具有不同目录的MyUser 实例,您还可以将MyUser 类设为通用。

我可能完全错了,这完全是垃圾,但至少我会这样做:)

【讨论】:

    【解决方案2】:

    您可以节省地对 MyUser 类中的 _DIR 字段进行类型转换。通过构造函数可以确保有一个MyDirectory 的实例:

    (_DIR as MyDirectory).SomeMethod()
    

    【讨论】:

    • 这是我目前所做的,但它是否满足“时尚”的要求?
    • 什么是“时尚”?
    猜你喜欢
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多