Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建一个抽象但不在内部的类_C# - Fatal编程技术网

C# 如何创建一个抽象但不在内部的类

C# 如何创建一个抽象但不在内部的类,c#,C#,这在c#中可能吗?这正是我需要它的原因: 他(用户)不能创建此类的实例。但是,我希望能够在项目中创建此类的实例。(因此:内部) 其他类应该能够从中继承。 我想强制用户只使用较大的声音类。 大的“但是”:如果我给用户这个类,用户必须能够使用它的实例,这就是为什么我不能只将它设置为内部并使用它。我也不能把它抽象化,因为我想自己复制。我曾考虑过给像IChannel这样的用户专用界面,但这并不能解决我的问题,他不应该能够创建Channel的实例。如果他寻找这个类,如果他足够冒险,甚至尝试创建一个实例,他

这在c#中可能吗?这正是我需要它的原因: 他(用户)不能创建此类的实例。但是,我希望能够在项目中创建此类的实例。(因此:内部) 其他类应该能够从中继承。 我想强制用户只使用较大的声音类。 大的“但是”:如果我给用户这个类,用户必须能够使用它的实例,这就是为什么我不能只将它设置为内部并使用它。我也不能把它抽象化,因为我想自己复制。我曾考虑过给像IChannel这样的用户专用界面,但这并不能解决我的问题,他不应该能够创建Channel的实例。如果他寻找这个类,如果他足够冒险,甚至尝试创建一个实例,他仍然能够看到这个类。 但正如我之前提到的:我不能把它抽象化,因为我需要在内部复制


谢谢你的帮助

内部构造函数。

内部构造函数不应该解决这个问题吗?这样,只有您的程序集才能创建实例,但用户仍然可以不受限制地使用实例。

只需将类的构造函数设置为内部构造函数?

您应该能够将构造函数声明为内部构造函数,并将类本身声明为公共构造函数。这应该(我认为)给你你想要的。

你可以通过在构造函数上使用不同的修饰符来控制实例的创建:

public class MyClass
{
    internal MyClass()
    {
    }
}

现在没有人可以实例化您的类,但是如果您给他们一个实例,他们可以像正常情况一样使用它。

正如许多其他人提到的,您可以在公共类中拥有一个内部构造函数


但是,我会为客户提供一个公共接口,并使整个类成为内部类(如果您希望客户机能够将其子类化,则将其抽象)。这样,他们将使用接口,这将使他们更容易对代码进行单元测试。它将使您能够灵活地在将来更改实现。

使用内部作用域构造函数将允许您在同一程序集或使内部构件可见的任何其他程序集中创建子类。但是,它将阻止在其他程序集中创建子类,因为从其他程序集中派生的每个类都需要在基类上调用构造函数。如果您的构造函数基于其作用域不可用,这将阻止其他构造函数从您的类派生

不过,总的来说,我不喜欢这种想法。作为一名开发人员,发现我正在使用的API的开发人员认为他知道我想要如何使用它的一切,这真的很烦人。是的,如果必须的话,请隐藏实现的内部细节,但是请允许我扩展API以完成我需要的(而且您还没有想到)并且不要让我跳过障碍来完成它


哦——是的,确实要为它创建一个接口,并将其用作返回。从长远来看,您将使我和您的生活变得更轻松,此外,您还可以更轻松地在我的单元测试中模拟您的代码。

我认为您需要的是一个
公共
类,该类具有
受保护的
构造函数和
内部
工厂方法:

public class MyClassWhichIsAbstractExceptForMe
{
    // Allow derived classes but prevent public construction.
    protected MyClassWhichIsAbstractExceptForMe()
    {
    }

    // Allow internal construction
    internal static MyClassWhichIsAbstractExceptForMe Create()
    {
        return new MyClassWhichIsAbstractExceptForMe();
    }
}

我也温和地推荐一个设计回顾。正如其他人所指出的,这似乎很奇怪。

谢谢!问这个问题是件好事,因为我考虑得更多一些,如果接口是公共的,而频道本身是内部的,那么接口方法就会起作用。但这会很难看:)(没有人需要或想要额外的接口)我不同意;如果我在测试依赖于您的类的代码,我肯定会想要一个接口,因为在单元测试期间接口很容易被删除。接口的另一个好处是,它只公开与类的公共使用相关的功能,这些功能可能是您在类内部使用的公共方法的子集。我最终用它创建了一个接口,因为作为抽象类通道,它继承了我以前没有考虑的其他构造函数。我不想增加压舱物,出于其他一些原因,结果很完美。有时你只是运气好:)(例如:其他类提供了IChannel的实际实现,它将是内部的。这是完美的,因为你也不能创建接口的实例)