[英]How To Make Abstract Class And Inherit In Other Classes
我有兩個具有相似代碼但卻具有不同變量的類
ISource.cs
public interface ISource
{
string AvailConfigPath { get; }
string AvailVersion { get; }
IDictionary<string, string> AvailFiles { get; }
}
public class Source : ISource
{
public string AvailConfigPath
{
get
{
return @"D:\Mindful\Visual Studio 2012\Projects\AutoUpdator\AutoUpdator\Source\AvailInfoFile.config";
}
}
private XDocument document = XDocument.Load(@"D:\Mindful\Visual Studio 2012\Projects\AutoUpdator\AutoUpdator\Source\AvailInfoFile.config");
public string AvailVersion
{
get
{
return document.Root
.Element("InfoConfigFile")
.Attribute("version").Value.ToString();
}
}
public IDictionary<string, string> AvailFiles
{
get
{
return document.Root
.Element("files")
.Elements("file")
.ToDictionary(x => x.Attribute("name").Value,
x => x.Attribute("version").Value);
}
}
}
ITarget.cs
public interface ITarget
{
string LocalConfigPath { get; }
string LocalVersion { get; }
IDictionary<string, string> LocalFiles { get; }
}
internal class Target : ITarget
{
public string LocalConfigPath
{
get
{
return @"D:\Mindful\Visual Studio 2012\Projects\AutoUpdator\AutoUpdator\Target\LocalInfoFile.config";
}
}
private XDocument document = XDocument.Load(@"D:\Mindful\Visual Studio 2012\Projects\AutoUpdator\AutoUpdator\Target\LocalInfoFile.config");
public string LocalVersion
{
get
{
return document.Root
.Element("InfoConfigFile")
.Attribute("version").Value;
}
}
public IDictionary<string, string> LocalFiles
{
get
{
return document.Root
.Element("files")
.Elements("file")
.ToDictionary(x => x.Attribute("name").Value,
x => x.Attribute("version").Value);
}
}
}
現在,我想創建一個抽象類,並將我的通用代碼放入該類文件中,然后在這兩個類文件中繼承該代碼
看起來您應該可以通過以下方式將它們組合:
public interface ITarget
{
string LocalConfigPath { get; }
string LocalVersion { get; }
IDictionary<string, string> LocalFiles { get; }
}
public interface ISource
{
string AvailConfigPath { get; }
string AvailVersion { get; }
IDictionary<string, string> AvailFiles { get; }
}
internal abstract class BaseClass
{
public virtual string ConfigPath { get; }
private XDocument document = XDocument.Load(ConfigPath);
public string Version
{
get
{
return document.Root
.Element("InfoConfigFile")
.Attribute("version").Value;
}
}
public IDictionary<string, string> Files
{
get
{
return document.Root
.Element("files")
.Elements("file")
.ToDictionary(x => x.Attribute("name").Value,
x => x.Attribute("version").Value);
}
}
}
internal class Target : BaseClass, ITarget
{
public override string LocalConfigPath
{
get
{
return @"D:\Mindful\Visual Studio 2012\Projects\AutoUpdator\AutoUpdator\Target\LocalInfoFile.config";
}
}
public string LocalVersion
{
get { return Version; }
}
public IDictionary<string, string> LocalFiles
{
get { return Files; }
}
}
public class Source : BaseClass, ISource
{
public override string AvailConfigPath
{
get
{ return @"D:\Mindful\Visual Studio 2012\Projects\AutoUpdator\AutoUpdator\Source\AvailInfoFile.config"; }
}
public string AvailVersion
{
get { return Version; }
}
public IDictionary<string, string> AvailFiles
{
get { return Files; }
}
}
注意:不要使用類名BaseClass
使它更適合於域。 我只是用它來說明那是“基類”
還要注意,如果Source
是公共的,則BaseClass
也必須是公共的。 如果您真的想在內部烘焙BaseClass,則可以使用封裝而不是繼承-仍在重用代碼,但方法有所不同。
感謝D Stanley__,您的回答對我解決了很多問題
AbstractClass.cs
public abstract class BaseClass
{
private string _ConfigPath;
public string ConfigPath
{
get { return _ConfigPath; }
set { _ConfigPath = value; }
}
private XDocument _Document = null;
private XDocument document
{
get
{
if (_Document == null)
_Document = XDocument.Load(ConfigPath);
return _Document;
}
}
public string Version
{
get
{
return document.Root
.Element("InfoConfigFile")
.Attribute("version").Value;
}
}
public IDictionary<string, string> Files
{
get
{
return document.Root
.Element("files")
.Elements("file")
.ToDictionary(x => x.Attribute("name").Value,
x => x.Attribute("version").Value);
}
}
}
ISource.cs
public interface ISource
{
string ConfigPath { get; }
string AvailVersion { get; }
IDictionary<string, string> AvailFiles { get; }
}
public class Source : BaseClass, ISource
{
public Source()
{
ConfigPath = @"D:\Mindful\Visual Studio 2012\Projects\AutoUpdator\AutoUpdator\Source\AvailInfoFile.config";
}
public string AvailVersion
{
get
{
return Version;
}
}
public IDictionary<string, string> AvailFiles
{
get
{
return Files;
}
}
}
ITarget.cs
public interface ITarget
{
string ConfigPath { get; }
string LocalVersion { get; }
IDictionary<string, string> LocalFiles { get; }
}
internal class Target : BaseClass, ITarget
{
public Target()
{
ConfigPath = @"D:\Mindful\Visual Studio 2012\Projects\AutoUpdator\AutoUpdator\Target\LocalInfoFile.config";
}
public string LocalVersion
{
get
{
return Version;
}
}
public IDictionary<string, string> LocalFiles
{
get
{
return Files;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.