是否可以防止使用抽象类作为属性类型?
我在具有泛型类型的抽象类中继承了一个抽象基类,而抽象基类又在具有定义类型的类中继承。是否可以用泛型类型“锁定”抽象类,因此不可能在其他类中使用它作为属性?
这是我的近况。我想防止创建像doubleFoo2这样的属性的可能性。Foo<T>只能在其他类中被继承,而不能直接作为类型使用。
由于我正在验证属性及其基本类型的PropertyType,这导致我犯了一个错误--我花了一段时间才找到。下面是对代码的测试:https://dotnetfiddle.net/OMHmGv
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; }
}发布于 2017-12-28 08:59:56
这不仅是不可能的,而且违背了面向对象编程的三个基本原则之一--当然,我说的是多态。
放弃多态性就是完全放弃面向对象的编程。
要点是,类型的引用实际上可以引用从引用类型派生的任何类型的实例。
多态使得下面的代码行非常有效(尽管不是很有用):
object s = "the type is actually a string but the reference is of type object";发布于 2017-12-28 09:11:51
编辑:就像@Zohar Peled所说的,它违背了多态性的目的,限制基于命名空间或程序集的使用是您唯一的方法。
如果DoubleFoo及其子类是在单独的程序集中创建的,则可以使用
内部
修饰语代替
公共的
对于FooBase和Foo类,以防止其他程序集访问它们。
如果必须在同一个程序集中使用此DoubleFoo,则可以尝试将基类放置在不同的命名空间中以隐藏基类实现类。一个例子是:
内部FooOfT.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; }
}
}内部DoubleFoo.cs
using FooTester.DoubleFoo.Foo
namespace FooTester.DoubleFoo
{
public class DoubleFoo : Foo<double>
{
public override double Value { get; set; }
}
}内部FooHandler.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
}
}https://stackoverflow.com/questions/48004207
复制相似问题