【问题标题】:Restrict to use a class as a type in another class in c#限制在c#中将一个类用作另一个类中的类型
【发布时间】:2016-12-25 15:54:36
【问题描述】:

我有课

abstract class EmployeeBase
{
}

我希望这个EmployeeBase 不应该用作我的任何其他类的属性。只有派生自EmployeeBase 的类可用于在任何其他类中声明属性。有可能实现吗?如果有,怎么做?

【问题讨论】:

  • 你不能,基本上。你为什么想要?继承的全部意义在于您可以使用抽象类——很多代码不需要依赖于所使用的实现。
  • 在使用 EF 代码优先方法时,我想避免为基类创建字段。我只希望在创建表时使用继承的类。
  • 所以一定要自己做。如果你真的想要的话,你总是可以编写测试来通过反射来检查这一点 - 但语言中没有任何内容。
  • 虽然没有什么能阻止你说创建class MissPiggy { EmployeeBase Golly {get;set;} },VS 会很高兴地编译它,你必须在你的 DEV 机器上或在你的 CI/gated 上用nDepend 检测它复选框。

标签: c# oop


【解决方案1】:

你不能创建抽象类的实例,所以不会有变量或属性被创建为EmployeeBase

你必须从EmployeeBase继承,所以我相信你的问题已经解决了;)

public abstract class EmployeeBase{}
public class Employee: EmployeeBase{}
class SomeClass
{
    public EmployeeBase Employee { get; set; }
    SomeClass()
    {
        Employee = new Employee(); // OOP in play :)
        Employee = new EmployeeBase(); // Error CS0144  
        // Cannot create an instance of the abstract class or interface 'EmployeeBase'
    }
}

【讨论】:

  • @MickyD 不。作者想要Only a class derived from EmployeeBase can be used,就是这样。
  • 哦,没看到。 OP很奇怪
【解决方案2】:

您可以通过将EmployeeBase 设为您希望从中派生的类的protected 子类来接近这一点:

public class OuterClass
{
    protected abstract class EmployeeBase { /*...*/ }
}

但是,请记住,这将防止 EmployeeBase 类型的任何属性被公开为 publicinternal,因为您不能公开具有较少公开类型的对象,因为任何消费代码都不会不知道对象的签名。 编辑但是,您可以通过 interface 或其他基本类型公开它们。

虽然您可以通过将所有构造函数设为internal 来限制从EmployeeBase 的继承,但在C# 中并不能很好地支持限制类型的使用,并且会引发很多关于您到底想要做什么的问题。

【讨论】:

    猜你喜欢
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    相关资源
    最近更新 更多