Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.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#_Class_Inheritance_Abstract - Fatal编程技术网

C# 防止将抽象类用作属性类型

C# 防止将抽象类用作属性类型,c#,class,inheritance,abstract,C#,Class,Inheritance,Abstract,是否可以防止使用抽象类作为属性类型 我在泛型类型的抽象类中继承了一个抽象基类,而泛型类型又在已定义类型的类中继承。是否可以使用泛型类型“锁定”抽象类,从而无法将其用作其他类中的属性 这是我的大致情况。我想防止创建类似于doubleFoo2的属性。Foo应该只能在其他类中继承,不能直接用作类型 由于我正在验证属性及其基本类型的PropertyType,这导致我花了一段时间才发现一个错误。下面是对代码的测试: 公共抽象类FooBase { //各种泛型属性和方法 } 公共抽象类Foo:FooBase

是否可以防止使用抽象类作为属性类型

我在泛型类型的抽象类中继承了一个抽象基类,而泛型类型又在已定义类型的类中继承。是否可以使用泛型类型“锁定”抽象类,从而无法将其用作其他类中的属性

这是我的大致情况。我想防止创建类似于
doubleFoo2
的属性。
Foo
应该只能在其他类中继承,不能直接用作类型

由于我正在验证属性及其基本类型的
PropertyType
,这导致我花了一段时间才发现一个错误。下面是对代码的测试:

公共抽象类FooBase
{
//各种泛型属性和方法
}
公共抽象类Foo:FooBase
{
公共类型ValueType{get{return typeof(T);}
公共抽象T值{get;set;}
}
公共类双Foo:Foo
{
公共重写双值{get;set;}
}
公共类FooHandler
{
公共DoubleFoo doubleFoo1{get;set;}
公共Foo doubleFoo2{get;set;}
}

这不仅是不可能的,而且违背了面向对象编程的三个基本原则之一——当然,我说的是。
放弃多态性就是完全放弃面向对象编程

关键是类型的引用实际上可以引用从引用类型派生的任何类型的实例

多态性使以下代码行完全有效(尽管不是很有用):


这不仅是不可能的,而且违背了面向对象编程的三个基本原则之一——当然,我说的是。
放弃多态性就是完全放弃面向对象编程

关键是类型的引用实际上可以引用从引用类型派生的任何类型的实例

多态性使以下代码行完全有效(尽管不是很有用):


编辑:正如@Zohar Peled所说,它违背了多态性的目的,基于名称空间或程序集限制使用是唯一的方法

如果DoubleFoo及其子类是在单独的程序集中创建的,则可以使用

内部的

改性剂代替

公开的

用于FooBase和Foo类,以防止其他程序集访问它们

如果必须在同一程序集中使用此DoubleFoo,可以尝试将基类放在不同的命名空间中以隐藏基类实现类。 例如:

内部fooft.cs

namespace FooTester.DoubleFoo.Foo
{
    public abstract class FooBase
    {
        // Various generic properties and methods
    }

    public abstract class Foo<T> : FooBase 
    {
        public Type ValueType { get { return typeof(T); } }
        public abstract T Value { get; set; }
    }
}
名称空间FooTester.DoubleFoo.Foo
{
公共抽象类FooBase
{
//各种泛型属性和方法
}
公共抽象类Foo:FooBase
{
公共类型ValueType{get{return typeof(T);}
公共抽象T值{get;set;}
}
}
内部DoubleFoo.cs

using FooTester.DoubleFoo.Foo

namespace FooTester.DoubleFoo
{
    public class DoubleFoo : Foo<double> 
    {
        public override double Value { get; set; }
    }
}
使用FooTester.DoubleFoo.Foo
命名空间FooTester.DoubleFoo
{
公共类双Foo:Foo
{
公共重写双值{get;set;}
}
}
在foodhandler.cs中

using FooTester.DoubleFoo

namespace FooTester
{
    public class FooHandler
    {
        public DoubleFoo doubleFoo1 { get; set; }
        // public Foo<double> doubleFoo2 { get; set; } Cannot access Foo<T> class
    }
}
使用FooTester.DoubleFoo
名称空间FooTester
{
公共类FooHandler
{
公共DoubleFoo doubleFoo1{get;set;}
//public Foo doubleFoo2{get;set;}无法访问Foo类
}
}

编辑:正如@Zohar Peled所说,它违背了多态性的目的,基于名称空间或程序集限制使用是唯一的方法

如果DoubleFoo及其子类是在单独的程序集中创建的,则可以使用

内部的

改性剂代替

公开的

用于FooBase和Foo类,以防止其他程序集访问它们

如果必须在同一程序集中使用此DoubleFoo,可以尝试将基类放在不同的命名空间中以隐藏基类实现类。 例如:

内部fooft.cs

namespace FooTester.DoubleFoo.Foo
{
    public abstract class FooBase
    {
        // Various generic properties and methods
    }

    public abstract class Foo<T> : FooBase 
    {
        public Type ValueType { get { return typeof(T); } }
        public abstract T Value { get; set; }
    }
}
名称空间FooTester.DoubleFoo.Foo
{
公共抽象类FooBase
{
//各种泛型属性和方法
}
公共抽象类Foo:FooBase
{
公共类型ValueType{get{return typeof(T);}
公共抽象T值{get;set;}
}
}
内部DoubleFoo.cs

using FooTester.DoubleFoo.Foo

namespace FooTester.DoubleFoo
{
    public class DoubleFoo : Foo<double> 
    {
        public override double Value { get; set; }
    }
}
使用FooTester.DoubleFoo.Foo
命名空间FooTester.DoubleFoo
{
公共类双Foo:Foo
{
公共重写双值{get;set;}
}
}
在foodhandler.cs中

using FooTester.DoubleFoo

namespace FooTester
{
    public class FooHandler
    {
        public DoubleFoo doubleFoo1 { get; set; }
        // public Foo<double> doubleFoo2 { get; set; } Cannot access Foo<T> class
    }
}
使用FooTester.DoubleFoo
名称空间FooTester
{
公共类FooHandler
{
公共DoubleFoo doubleFoo1{get;set;}
//public Foo doubleFoo2{get;set;}无法访问Foo类
}
}

是否可以使用泛型类型“锁定”抽象类,从而无法在其他类中将其用作属性?不,不可能。你为什么关心这样的事?您想要实现什么?可能需要将其设置为
内部
私有
?@CodingYoshi,正如我所写:“由于我正在验证属性的PropertyType及其基本类型,这导致我犯了一个错误,我花了一段时间才发现。”例如,我想避免再次犯错误。你想做的事在C#中是不可能的。是限制类型暴露的唯一工具。我认为你在这上面浪费时间。请解释一下你的目标是什么。你犯了什么错误?是否有可能用泛型类型“锁定”抽象类,因此不可能在其他类中将其用作属性?不,不可能。你为什么关心这样的事?你想达到什么目的?可能是你需要将其设置为
内部
私有
?@CodingYoshi,正如我所写:“因为我正在验证PropertyType