首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止将抽象类用作属性类型

防止将抽象类用作属性类型
EN

Stack Overflow用户
提问于 2017-12-28 08:35:24
回答 2查看 577关注 0票数 1

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

我在具有泛型类型的抽象类中继承了一个抽象基类,而抽象基类又在具有定义类型的类中继承。是否可以用泛型类型“锁定”抽象类,因此不可能在其他类中使用它作为属性?

这是我的近况。我想防止创建像doubleFoo2这样的属性的可能性。Foo<T>只能在其他类中被继承,而不能直接作为类型使用。

由于我正在验证属性及其基本类型的PropertyType,这导致我犯了一个错误--我花了一段时间才找到。下面是对代码的测试:https://dotnetfiddle.net/OMHmGv

代码语言:javascript
复制
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; }
}

public class DoubleFoo : Foo<double> 
{
    public override double Value { get; set; }
}

public class FooHandler
{
    public DoubleFoo doubleFoo1 { get; set; }
    public Foo<double> doubleFoo2 { get; set; }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-28 08:59:56

这不仅是不可能的,而且违背了面向对象编程的三个基本原则之一--当然,我说的是多态

放弃多态性就是完全放弃面向对象的编程。

要点是,类型的引用实际上可以引用从引用类型派生的任何类型的实例。

多态使得下面的代码行非常有效(尽管不是很有用):

代码语言:javascript
复制
object s = "the type is actually a string but the reference is of type object";
票数 4
EN

Stack Overflow用户

发布于 2017-12-28 09:11:51

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

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

内部

修饰语代替

公共的

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

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

内部FooOfT.cs

代码语言:javascript
复制
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; }
    }
}

内部DoubleFoo.cs

代码语言:javascript
复制
using FooTester.DoubleFoo.Foo

namespace FooTester.DoubleFoo
{
    public class DoubleFoo : Foo<double> 
    {
        public override double Value { get; set; }
    }
}

内部FooHandler.cs

代码语言:javascript
复制
using FooTester.DoubleFoo

namespace FooTester
{
    public class FooHandler
    {
        public DoubleFoo doubleFoo1 { get; set; }
        // public Foo<double> doubleFoo2 { get; set; } Cannot access Foo<T> class
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48004207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档