我有2个班级,Child
班级继承自Parent
班级。
public class Parent
{
public string item{get;set;}
}
public class Child : Parent
{
}
public static void ConsoleWrite(Parent pitem)
{
Console.Write(pitem.item);
}
public static void Main()
{
ConsoleWrite(new Child(){item = "foo"});
}
https://dotnetfiddle.net/yPriNl
只能使用ConsoleWrite
对象调用Parent
方法,但也可以使用Child
对象调用它。有没有办法对此进行评估?
答案 0 :(得分:1)
我建议您在不同的命名空间和您的Program类中组织您的父级别的子句。将子类定义为私有。这样就无法访问儿童元素,但只有当它们被转移到父母身上时才会访问:
namespace ClassesDemo
{
public class Parent
{
public string item{get;set;}
}
private class Child : Parent
{
}
}
namespace MainProgram
{
class Program
{
public static void ConsoleWrite(Parent pitem)
{
Console.Write(pitem.item);
}
public static void Main()
{
ConsoleWrite(new Child(){item = "foo"});
}
}
}
答案 1 :(得分:1)
总的来说,没有多大意义,如果你不想让孩子可以用在期望他们父母的方法中,你为什么要使用遗产呢?
您可以通过抛出异常来阻止它:
public static void ConsoleWrite(Parent pitem)
{
if(pitem?.GetType().IsSubclassOf(typeof(Parent)) == true)
{
throw new ArgumentException("Only parent type is allowed", nameof(pitem));
}
Console.Write(pitem?.item);
}
也许你不想要继承,但两个类都有共同的属性,你可以让它们实现相同的接口:
public interface IItem
{
string Item { get; set; }
}
public class Type1: IItem
{
public string Item { get; set; }
}
public class Type2 : IItem
{
public string Item { get; set; }
}
现在他们不是父母 - 孩子,因此期望Type1
的方法无法与Type2
的实例一起使用。但是,如果该方法接受IItem
,您将遇到同样的问题; - )
答案 2 :(得分:0)
我已经修改了一些代码来限制它,但它没有显示任何编译时错误。引发运行时错误。代码如下:
using System;
public class Program
{
public class Parent
{
public virtual string item{get;set;}
}
public class Child : Parent
{
public new string item
{
get
{
throw new NotSupportedException();
}
set
{
throw new NotSupportedException();
}
}
}
public static void ConsoleWrite(Parent pitem)
{
Console.Write(pitem.item);
}
public static void Main()
{
ConsoleWrite(new Child(){item = "foo"});
}
}